假设源树在这个结构中:
/
|- lib1
| |- src.cpp
| |- lib1.h
| |- CMakeLists.txt
|
|- lib2
| |- src.cpp
| |- lib2.h
| |- CMakeLists.txt
|
|- lib3
| |- src.cpp
| |- lib3.h
| |- CMakeLists.txt
|
|- app
| |- src.cpp
| |- CMakeLists.txt
|
|- CMakeLists.txt
认为:
我想:
app/CMakeLists.txt 中的
所以我的问题是:有没有办法以可扩展的方式编写 CMakeLists.txt 文件来满足上述要求?如果没有,那么是否有一些类似的工具可以做到这一点?
谢谢。
最佳答案
对于第一个问题:
在 lib2/CMakeLists.txt
你应该把这个:
target_link_libraries(lib2 lib1)
在 app/CMakeLists.txt 中:
target_link_libraries(app lib2)
现在,如果您尝试构建应用程序,CMake 将检查 lib2 是否是最新的,如果不是 - 重建 lib1 和 lib2。
对于第二个问题:
您可以使用基于
add_subdirectory(lib3)
变量的 if()
块保护 option()
调用。另一种方式 - 在 lib3/CMakeLists.txt 中:
add_library(lib3 ${SRCS} EXCLUDE_FROM_ALL)
这将使 CMake 不将
lib3
目标添加到 all
目标中。如果您尝试根据它构建某些东西,或者手动发出 make lib3
,则仍将构建此目标。关于c++ - 在cmake中,如何以可扩展的方式指定子目录的依赖关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9439865/