我有一个具有以下文件夹结构的项目
/
|- 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。但是,提出的解决方案似乎并没有解决我的问题。
我可以采取哪些不同的方式解决问题?
答案 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
文件的硬编码引用,则会将生成的构建脚本限制为以此格式生成静态库的编译器。