我刚开始玩CMake。我有类似的东西:
/DEV
|-- lib1
| CMakeLists.txt
|-- lib2
| CMakeLists.txt
|-- exe1
| CMakeLists.txt
/BUILD
|-- lib1
|-- lib2
|-- exe1
/INSTALL
|-- include
|-- lib
|-- bin
我想:
我没有任何线索从哪里开始。请帮忙......
答案 0 :(得分:11)
您不需要单独的CMakeLists.txt来独立构建目标。假设您有一个顶级CMakeLists.txt:
ADD_LIBRARY(lib1 ${all_lib1_files})
ADD_LIBRARY(lib2 ${all_lib2_files})
ADD_EXECUTABLE(exe1 ${all_exe1_files})
TARGET_LINK_LIBRARIES(lib2 lib1) # lib2 now depends on lib1
TARGET_LINK_LIBRARIES(exe1 lib2) # exe1 now depends on lib2 and lib1
然后你可以通过运行make lib1
或msbuild lib1.vcxproj
等来构建lib1。你可以通过为每个目标提供单独的CMakeLists.txt文件来实现同样的目标 - 如果你认为值得的话,这取决于你
如果您的项目使用FIND_LIBRARY
或FIND_PACKAGE
导入这些目标,那么如果它们不是最新的,那么将不会重建。最后,如果您想要自动重建过时的依赖项,您需要让CMake了解依赖目标的源和规则,即CMakeLists.txt文件需要使用ADD_LIBRARY
添加目标或ADD_EXECUTABLE
。
您不应该引用INSTALL目录(我想象的INSTALL
命令除外),因为在链接目标时,CMake将隐式使用libs / exes构建位置而不是安装位置。
答案 1 :(得分:3)
要
在需要时独立构建每个lib和exe。
只需将EXCLUDE_FROM_ALL
个关键字添加到add_executable()
或add_library()
来电。
构建时,include和lib目录应该引用INSTALL 目录
如果按referencing
,则表示将其添加到include_directories()
和link_directories()
,那就不太好了。最好不要在用户系统上断言所需文件的位置。正确的方法是使用find_package()
,find_library()
或find_file()
找到所需的包含和库。如果要使用第一个函数,则需要编写FindYourLib.cmake
并将其安装在库本身。
构建时,将依赖项添加到其他lib,如果没有则重建它们 最新
这是由CMake自动完成的。可以使用add_dependencies()
函数添加依赖项,也可以使用target_link_libraries()
隐式添加依赖项。