Cmake 指定生成子目录的顺序
我有一个文件夹结构如下的项目Cmake 指定生成子目录的顺序,cmake,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 | |- in
/
|- 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)
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)
我的app/CMakeLists.txt如下:
add_library(MyLib1 STATIC ${LIB_SRC})
install(TARGETS MyLib1 DESTINATION ${CMAKE_SOURCE_DIR}/bin)
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)
在我的build文件夹中,我调用cmake,它成功地构建了MyLib1,但没有安装它。生成的错误是:
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).
我已经看到了一些关于堆栈溢出的答案,其中最相关的是。但是,提议的解决方案似乎并没有解决我的问题
我可以采取哪些不同的措施来解决此问题?您应该使用CMake目标,而不是将程序直接链接到
.a
文件
那么这个
target_link_libraries(app ${CMAKE_SOURCE_DIR}/bin/libMyLib1.a)
变成这样
target_link_libraries(app MyLib1)
MyLib1
是您在add\u库
命令中使用的名称。通过这种方式,CMake将生成生成生成文件(例如makefiles),这些文件按照并行生成的正确依赖顺序编排生成过程(MyLib1
始终在app
之前)。我认为install命令不再必要了
请注意,使用CMake目标名称是最正确的方法,因为CMake的强度是生成跨平台构建文件。如果对
.a
文件使用硬编码引用,则将生成的生成脚本限制为生成此格式静态库的编译器。如果只将目标链接库(app MyLib1)
放在app
的链接中,而不使用库的相对位置,会发生什么?请注意,直接使用库的名称将使此构建不可移植,这是CMake的优势之一。@Henrique,这很有效!我也发现了同样的建议。见注释1.5。那我就提交答复。