将一个项目链接到另一个 CMAKE

Jai*_*Jai 6 cmake

我正在构建一个包含很多子项目的项目。例如作为...

LibA (build as shared library)

LibB (depends on LibA & build as shared library)

AppB (depends on LinB)
Run Code Online (Sandbox Code Playgroud)

目录结构(我想要的)是...

bin/
output/
src/libA/
src/libB/
src/appB/
Run Code Online (Sandbox Code Playgroud)

每个子项目(LibA、LibB 和 AppB)都有自己的 CMakeLists.txt 文件。

我想 ..

1. Build LibA as shared library (I know how to do it)

2. Build LibB as shared library with linking of LibA (Don't Know how to do)
   Explanation: When I start building LibB, 
                LibA build first and 
                ready to link for LibB 
                when LibB ready to finish

3. Build AppB : If I start building AppB, 
                LibA build first and 
                LibB build after and
                both linked to AppB
Run Code Online (Sandbox Code Playgroud)

现在我知道经典的方法,分别构建 LibA 和 LibB 并提供 lib 路径并包含到 AppB。但我想立即构建它们,就像

  Build LibA 
  Build LibB (if LibA is already build then ignore, else build LibA)
  Build AppB (if LibA, LibB are already build then ignore, else build them)
Run Code Online (Sandbox Code Playgroud)

我想要的是

  • 如何使用 CMAKE 实现这种行为?
  • 应该是跨平台的
  • 足够简单,可以包含更多子项目

squ*_*les 7

这是一种解决方案。您可以使用顶级CMakeLists.txt文件将所有项目联系在一起。因此,在您的目录结构中,这将放置在这里:

bin/
output/
src/libA/
src/libB/
src/appB/
CMakeLists.txt    <--- Top-level CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

您的顶级CMakeLists.txt文件(作为src目录的同级文件)可能如下所示:

cmake_minimum_required(VERSION 3.11)

# Add your dependencies in the order you want them to build.
add_subdirectory(src/libA)
add_subdirectory(src/libB)
add_subdirectory(src/appB)
Run Code Online (Sandbox Code Playgroud)

每个src目录都有自己的CMakeLists.txt文件,下面是每个目录的示例。

您可以使用 CMake 将 LibA 设置为共享库,CMakeLists.txt文件位于src/libA

project(LibA_Project)
add_library(LibA SHARED sourceA.cpp  ... more sources here ...)
Run Code Online (Sandbox Code Playgroud)

接下来,CMake会遍历到该src/libB目录来配置LibB。该src/libB/CMakeLists.txt文件可能如下所示:

project(LibB_Project)
# Create a shared library for LibB as well.
add_library(LibB SHARED sourceB.cpp  ... more sources here ...)

# Link LibA to LibB as a dependency.
target_link_libraries(LibB LibA)
Run Code Online (Sandbox Code Playgroud)

最后,CMake会进入该src/appB目录。这是该CMakeLists.txt文件:

project(AppB_Project)
# Create the executable AppB.
add_executable(AppB main.cpp ... more sources here ...)

# Link LibA and LibB to AppB as dependencies.
target_link_libraries(AppB LibA LibB)
Run Code Online (Sandbox Code Playgroud)

如有必要,此方法可以轻松扩展以包含更多子项目(例如 LibC、LibD、AppE 等)。