这是我的源代码结构:
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 稍微复杂一些,并且使用生成器表达式,因此在进行更复杂的项目时,请务必阅读它。