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
Root
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
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)