【问题标题】:Specify order for building subdirectories CMake指定构建子目录 CMake 的顺序
【发布时间】:2018-04-17 22:48:30
【问题描述】:

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

/
 |- 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)

在我的构建文件夹中,我调用了 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).

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

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

【问题讨论】:

  • 如果你只是将target_link_libraries(app MyLib1 ) 放在app 的链接中而不是使用你的库的相对位置会发生什么?请注意,直接使用 lib 的名称将使此构建不可移植,这是 CMake 的优势之一。
  • @Henrique,这行得通!我还发现了相同的建议here。见评论1。
  • 酷。我会提交作为答案。

标签: cmake


【解决方案1】:

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

所以这个

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

变成这样

target_link_libraries(app MyLib1)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多