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

时间:2012-03-12 19:13:28

标签: cross-platform cmake cross-compiling

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

/DEV
 |-- lib1
        | CMakeLists.txt

 |-- lib2
        | CMakeLists.txt

 |-- exe1
        | CMakeLists.txt

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

/INSTALL
 |-- include
 |-- lib
 |-- bin

我想:

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

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

2 个答案:

答案 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 lib1msbuild lib1.vcxproj等来构建lib1。你可以通过为每个目标提供单独的CMakeLists.txt文件来实现同样的目标 - 如果你认为值得的话,这取决于你

如果您的项目使用FIND_LIBRARYFIND_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()隐式添加依赖项。