指定构建子目录的顺序CMake

时间:2018-04-17 22:48:31

标签: cmake

我有一个具有以下文件夹结构的项目

/
 |- build
 |- MyLib1
 |  |- source
 |  |  |- lib1_s1.cpp
 |  |  |- lib2_s2.cpp
 |  |- include
 |  |  |- lib1_s1.hpp
 |  |  |- lib2_s2.hpp
 |  |- CMakeLists.txt
 |- app
 |  |- source
 |  |  |- app_s1.cpp
 |  |  |- app_s2.cpp
 |  |- include
 |  |  |- app_s1.hpp
 |  |  |- app_s2.hpp
 |  |- CMakeLists.txt
 |
 |- CMakeLists.txt

我的应用程序依赖于MyLib1(编译为静态库)。 lib1 / CMakeLists.txt 如下:

add_library(MyLib1 STATIC ${LIB_SRC})
install(TARGETS MyLib1 DESTINATION ${CMAKE_SOURCE_DIR}/bin)

我的 app / CMakeLists.txt 如下:

add_executable(app ${APP_SRC}/main.cpp)
target_link_libraries(app ${CMAKE_SOURCE_DIR}/bin/libMyLib1.a )
install(TARGETS app DESTINATION ${CMAKE_SOURCE_DIR}/bin)

在我的构建文件夹中,我调用了成功构建MyLib1的cmake,但没有安装它。生成的错误是:

make[2]: *** No rule to make target `../bin/libMyLib1.a', needed by`/app'.  Stop.

我的Cmake版本是:

cmake version 3.11.0-rc3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

我已经看到了一些关于堆栈溢出的答案,最相关的是this。但是,提出的解决方案似乎并没有解决我的问题。

我可以采取哪些不同的方式解决问题?

1 个答案:

答案 0 :(得分:1)

您应该使用CMake目标,而不是直接将程序与.a文件关联。

所以这个

target_link_libraries(app ${CMAKE_SOURCE_DIR}/bin/libMyLib1.a)

成为这个

target_link_libraries(app MyLib1)

MyLib1是您在add_library命令中使用的名称。这样,CMake将生成构建文件(例如makefile),这些构建文件以并行构建的依赖关系的正确顺序编排构建过程(MyLib1 app之前始终。我认为不再需要安装命令。

请注意,使用CMake目标名称是最正确的方法,因为CMake的优势在于生成跨平台构建文件。如果您使用对.a文件的硬编码引用,则会将生成的构建脚本限制为以此格式生成静态库的编译器。