Cmake 在生成主目录之前,从子目录生成并安装共享库
以下是我的源代码结构:Cmake 在生成主目录之前,从子目录生成并安装共享库,cmake,Cmake,以下是我的源代码结构: cd my_git_repo/ CMakeLists.txt src/ main.cpp mylibrary/ a.hpp b.hpp a.cpp b.cpp CMakeLists.txt RootCMakeLists.txt: cmake_minimum_required(VERSION 3.9) pr
cd my_git_repo/
CMakeLists.txt
src/
main.cpp
mylibrary/
a.hpp
b.hpp
a.cpp
b.cpp
CMakeLists.txt
RootCMakeLists.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
target应该在构建myexe
之前构建并安装。但这并没有发生mylibrary
是由myexe
构建的。安装将在稍后进行。因此,查找库
失败pkg\u check\u modules()
适用于其他共享库,但由于同样的原因在此处失败
我感谢你的帮助
编辑:
此问题与重复问题不同,因为该问题的答案似乎是静态链接库
target\u link\u库(游戏引擎)
。我想动态链接。所以库。CMake的思想是构建模块,然后将它们链接在一起
您尚未为我的库共享CMakeLists.txt
,因此我们无法确定它在做什么。但是,假设它类似于:
ADD_LIBRARY(mylibrary
file1.cpp
file2.cpp
)
由于您指定希望mylibrary
始终作为共享链接,因此您还需要通过将BUILD\u shared\u LIBS
设置为ON
或在中指定shared
来告诉CMake:
这是您的库模块。我们现在将保持简单,不必担心在这里打包库存档和安装
现在,回到您的主要CMakeLists.txt
以及如何使myexe
使用它。由于您已经add_子目录(src/mylibrary)
,CMake知道mylibrary
。因此,只需使用模块名将其链接。无需查找\u库
,因为您已经定义了模块
add_executable(myexe src/main.cpp)
target_link_libraries(myexe mylibrary)
这应该足够了
但是,请注意,这是一个非常基本的示例,可以向您解释CMake是如何工作的。如果您没有构建库,并且库已经安装,您可以调用find\u library
。现代的CMake更为复杂和实用,所以在您进行更为复杂的项目时,一定要仔细阅读。可能重复的是,mylibrary
CMakeLists.txt非常简单。它确实添加了库(mylibrary共享blah)
。我确实尝试了target\u link\u库(myexe-mylibrary)
,效果不错。但是,它有动态链接吗?看起来库是静态链接的,这是我试图避免的。只需将cache变量设置为on。是的,正如@havogt所提到的,您可以将BUILD\u SHARED\u LIBS
设置为on
,或者您可以通过将add\u library更改为add\u library>来指定mylibrary
模块始终作为共享库构建和链接(mylibrary SHARED file1.cpp file2.cpp)
@psy您让我回答这个问题,但上面的答案是正确的。如果仍然不起作用,请告诉我们。
add_executable(myexe src/main.cpp)
target_link_libraries(myexe mylibrary)