【问题标题】:CMAKE - resolving dependencies between libraries in projectCMAKE - 解决项目中库之间的依赖关系
【发布时间】:2012-02-22 02:56:49
【问题描述】:

我正在使用 CMAKE 构建一个包含许多库和可执行文件的大型项目。我指定库依赖项的方式有问题,并且事情不能完全按预期工作。我的项目示意图如下所示:

CMakeLists.txt
lib1/src/CMakeLists.txt
lib2/src/CMakeLists.txt
app/src/CMakeLists.txt

即我有两个库 lib1 和 lib2,其中 lib2 依赖于 lib1,而应用程序同时依赖于 lib1 和 lib2。我使用共享链接和静态链接构建库:

add_library(lib1_static STATIC lib1_src)
add_library(lib1_shared SHARED lib1_src)
set_target_properties( lib1_static PROPERTIES OUTPUT_NAME lib1)
set_target_properties( lib1_shared PROPERTIES OUTPUT_NAME lib2)

为了确保依赖项得到满足,我将 target_link_libraries() 设置为:

#lib2/src/CMakeLists.txt:
target_link_libraries( lib2_shared lib1_shared )
target_link_libraries( lib2_static lib1_static )

对于应用程序:

#app/src/CMakeLists.txt
target_link_libraries( app_static lib2_static )   # <- No explicit dependance on lib1
target_link_libraries( app_shared lib2_shared )

现在 - 问题是当我重新构建时它会编译很长时间,但是在创建 liblib2.so 文件时出现错误消息:

make[2]: *** No rule to make target 'lib1/src/liblib1.so' needed by 'lib2/src/liblib2.so'. Stop.

出现。如果我然后发出一个新的 make 命令 - 事情将成功构建。所以看来我没有设法正确配置依赖项?请注意,第一次构建尝试的 make 输出显示:

Linking C shared library liblib1.so

所以构建本身已经成功 - 但似乎构建不会使用在此构建实例期间创建的 liblib1.s0 文件来解决 lib2 依赖项?

我已经尝试过 - 并再次删除 - 几种 link_directories() 和 target_depends() 都没有成功。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    看来,CMake 对

    的使用感到困惑
    set_target_properties( lib1_static PROPERTIES OUTPUT_NAME lib1)
    

    试试这个:

    target_link_libraries( lib2_shared lib1 )
    

    或删除这些属性设置。

    【讨论】:

    • 好的 - 感谢您的回答;如前所述,我最终通过升级 CMake 解决了这个问题。但我确实觉得我的 CMakeLists.txt 中的整个静态/共享处理非常复杂 - 所以也许我可以按照你的建议简化它。
    【解决方案2】:

    我使用的是 CMake 2.6 版 - 我升级到 CMake 2.8 然后它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      相关资源
      最近更新 更多