这是我的源代码结构:
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
库。
答案 0 :(得分:0)
CMake的想法是构建模块,然后将它们链接在一起。
您尚未为我的图书馆共享CMakeLists.txt
,因此我们无法确定它在做什么。但是,假设它是这样的:
ADD_LIBRARY(mylibrary
file1.cpp
file2.cpp
)
由于您指定要始终将mylibrary
链接为共享链接,因此您还需要通过将BUILD_SHARED_LIBS
设置为ON
或通过指定{{1} }在add_library
中:
SHARED
这是您的库模块。我们现在将其保持简单,而不必担心在此处打包库归档文件和安装。
现在,回到您的主ADD_LIBRARY(mylibrary SHARED
file1.cpp
file2.cpp
)
,以及如何使CMakeLists.txt
消费它。由于您已经myexe
,因此CMake知道add_subdirectory(src/mylibrary)
。因此,只需使用模块名称链接即可。您已经定义了模块,因此无需mylibrary
。
find_library
这足够了。
但是请注意,这是一个非常基本的示例,向您解释CMake是如何工作的。如果您没有构建该库,并且该库已经安装,则可以调用add_executable(myexe src/main.cpp)
target_link_libraries(myexe mylibrary)
。现代CMake稍微复杂一些,并使用generator expressions,因此在进行更复杂的项目时请务必仔细阅读。