这是我的源代码目录结构。
some project
libs
mylib1
...
3rdlibs1
...
apps
myapp1
...
我的要求如下:
- 3rdlibs1 应该在使用command 的时候编译。像“cmake -G ...”。
- 3rdlibs1 应该编译成静态库。
- mylib1 应该是模块化的。
- mylib1 依赖于 3rdlibs。
- myapp 依赖于 mylib1,它应该只链接到 mylib1。它不应依赖于 3rdlibs 或系统库。
你能给我一些示例代码吗?我知道 ExternalProject_Add 可以帮助我编译 3rdlibs。但我真的不知道该怎么做。 我认为其他人也可能对这个问题感兴趣。
最佳答案
如果您的所有源都在单个文件系统树中,那么使用 add_subdirectory
比使用 ExternalProject
更好。 ExternalProject
适用于真正外部的项目,例如在远程服务器或 VCS 存储库上。与add_subdirectory
可以创建任何类型的目标不同,ExternalProject
只能创建UTILITY 目标,类似于add_custom_target
命令。 UTILITY 目标有局限性,例如您不能在 target_link_libraries
命令中使用它们。使用 add_subdirectory
就简单多了。
顶级:
cmake_minimum_required(VERSION 3.7)
project("some_project")
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_subdirectory(libs/3rdlibs1)
add_subdirectory(libs/mylib1)
add_subdirectory(apps/myapp1)
应用:
project("myapp1")
set(SRC_FILES ...)
add_executable(myapp1 ${SRC_FILES})
target_link_libraries(myapp1 PRIVATE mylib1)
图书馆。正如我从您的描述中了解到的,3rdlibs1 是 mylib1 的可选依赖项。否则,没有 3rdlibs1,myapp 如何使用 mylib1?
project("mylib1")
option(THIRD_LIBS_SUPPORT "description" OFF)
set(SRC_FILES ...)
add_library(mylib1 STATIC ${SRC_FILES})
#PUBLIC means that both mylib1 and its dependents use the headers
target_include_directories(mylib1 PUBLIC "${PROJECT_SOURCE_DIR}/include")
if(THIRD_LIBS_SUPPORT)
#PUBLIC means that 3rdlibs1 will be linked to mylib1 dependents
target_link_libraries(mylib1 PUBLIC 3rdlibs1)
target_compile_definitions(mylib1 PUBLIC -DTHIRD_LIBS_SUPPORT)
endif()
关于c++ - 如何使用cmake编译现代c++项目代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44643586/