用于多个库和可执行文件的CMakeLists.txt文件

Kor*_*idu 12 cross-platform cmake cross-compiling

我刚开始玩CMake.我有类似的东西:

/DEV
 |-- lib1
        | CMakeLists.txt

 |-- lib2
        | CMakeLists.txt

 |-- exe1
        | CMakeLists.txt

/BUILD
 |-- lib1
 |-- lib2
 |-- exe1

/INSTALL
 |-- include
 |-- lib
 |-- bin
Run Code Online (Sandbox Code Playgroud)

我想要:

  • 在需要时独立构建每个lib和exe.(所以我想我必须为每个lib和exe添加一个CMakeLists.txt文件);
  • 构建时,include和lib目录应该引用INSTALL目录; (这是不是一个好主意?)
  • 构建时,将依赖项添加到其他lib并重建它们(如果不是最新的).

我没有任何线索从哪里开始.请帮忙...

Fra*_*ser 12

您不需要单独的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
Run Code Online (Sandbox Code Playgroud)

然后,您只需构建运行LIB1 make lib1msbuild lib1.vcxproj等,您可以通过在每个目标个体的CMakeLists.txt文件实现相同的-这是给你,如果你认为这是值得的.

如果您的项目使用FIND_LIBRARY或导入这些目标FIND_PACKAGE,那么如果它们不是最新的,则不会重建它们.最终,如果您希望自动重建过时的依赖项,则需要让CMake了解依赖目标的源和规则,即CMakeLists.txt文件需要使用ADD_LIBRARY或添加目标ADD_EXECUTABLE.

您不应该引用INSTALL目录(INSTALL我想象的命令除外),因为在链接目标时,CMake将隐式使用libs/exes构建位置而不是安装位置.

  • 在项目的根目录中拥有主CMakeLists.txt是正常的.如果需要,可以将CMakeLists.txt文件添加到每个exe文件夹,然后只需"INCLUDE".`INCLUDE`运行内联命令,因此不需要这些从属CMakeLists.txt文件完全独立(即它们不需要`PROJECT`命令等),它们只是实现分离的一种方式项目的不同部分,并保持顶级文件更清洁.每个可能只有`SET(all_exe1_files ...)`,`ADD_EXECUTABLE(exe1 $ {all_exe1_files})`和`SET_TARGET_PROPERTIES(exe1 ...)`. (2认同)