Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 指定生成子目录的顺序_Cmake - Fatal编程技术网

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。那我就提交答复。