【问题标题】:CMake build and install shared library from subdirectory before building main directoryCMake 在构建主目录之前从子目录构建和安装共享库
【发布时间】:2019-09-11 00:33:24
【问题描述】:

这是我的源代码结构:

cd my_git_repo/
    CMakeLists.txt
    src/
        main.cpp
        mylibrary/
            a.hpp
            b.hpp
            a.cpp
            b.cpp
            CMakeLists.txt

CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
project(myexe CXX)
add_subdirectory(src/mylibrary)

find_library(mylib NAMES mylibrary.so PATHS "./src/mylibrary/mylibrary.so")
add_executable(myexe src/main.cpp)
target_link_libraries(myexe ${mylib})

mylibrary/CMakeLists.txt 很简单。它构建一个共享库并安装它们。 理想情况下,mylibrary 目标应在构建 myexe 之前构建并安装。但这不会发生。 mylibrary 是在 myexe 之后构建的。安装稍后进行。因此,find_library 失败。 pkg_check_modules() 适用于其他共享库,但由于同样的原因在这里失败。

感谢您的帮助。

编辑: 这个问题与重复问题不同,因为发布到该问题的答案似乎静态链接库target_link_libraries(game engine)。我想动态链接.so库。

【问题讨论】:

标签: cmake


【解决方案1】:

CMake 中的想法是构建模块,然后将它们链接在一起。

你还没有为我的图书馆分享CMakeLists.txt,所以我们无法知道它在做什么。但是,假设它是这样的:

ADD_LIBRARY(mylibrary
  file1.cpp
  file2.cpp
)

由于您指定要始终将mylibrary 链接为共享,因此您还需要通过将BUILD_SHARED_LIBS 设置为ON 或在add_library 中指定SHARED 来告诉CMake:

ADD_LIBRARY(mylibrary SHARED
  file1.cpp
  file2.cpp
)

这是您的库模块。我们暂时保持简单,不必担心在此处打包库存档和安装。

现在,回到您的主要 CMakeLists.txt 以及如何让 myexe 使用它。因为你已经有了add_subdirectory(src/mylibrary),CMake 知道mylibrary。所以只需使用模块名称链接它。无需find_library,因为您已经定义了模块。

add_executable(myexe src/main.cpp)
target_link_libraries(myexe mylibrary)

这就够了。

但是请注意,这是一个非常基本的示例,用于向您解释 CMake 的设计原理。如果您不构建库,并且它已经安装,您可以调用find_library。现代 CMake 更复杂一些,并使用 generator expressions,所以当您进行更复杂的项目时,请务必阅读此内容。

【讨论】:

  • 是的,mylibraryCMakeLists.txt 非常简单。它确实add_library(mylibrary SHARED blah)。我确实尝试过target_link_libraries(myexe mylibrary),它奏效了。但是,它是否进行动态链接?看起来图书馆是静态链接的,我试图避免。
  • 只需将缓存变量BUILD_SHARED_LIBS设置为on即可。
  • 是的,正如@havogt 提到的,您可以将BUILD_SHARED_LIBS 设置为ON,或者您可以通过将add_library 更改为@ 来指定mylibrary 模块始终作为共享库构建和链接987654345@
  • @psy 你让我回答这个问题,但上面的答案是正确的。如果它仍然不起作用,请告诉我们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多