CMake 在构建主目录之前从子目录构建和安装共享库



这是我的源代码结构:

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 中的想法是构建模块,然后将它们链接在一起。

您尚未共享我的图书馆的CMakeLists.txt,因此我们无法知道它在做什么。但是,假设它是这样的:

ADD_LIBRARY(mylibrary
file1.cpp
file2.cpp
)

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

ADD_LIBRARY(mylibrary SHARED
file1.cpp
file2.cpp
)

这是您的库模块。我们现在将保持简单,而不用担心在这里打包库存档和安装。

现在,回到你的主要CMakeLists.txt以及如何myexe消费它。既然你已经add_subdirectory(src/mylibrary)了,清明知道mylibrary。因此,只需使用模块名称链接它即可。无需find_library,因为您已经定义了模块。

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

这应该足够了。

但是,请注意,这是一个非常基本的示例,可以向您解释CMake如何设计工作。如果您没有构建库,并且它已安装,则应调用find_library。现代 CMake 稍微复杂一些,并且使用生成器表达式,因此在进行更复杂的项目时,请务必阅读它。

最新更新