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

时间:2019-09-11 00:33:24

标签: 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库。

1 个答案:

答案 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,因此在进行更复杂的项目时请务必仔细阅读。