1

我有以下目录结构和库依赖项:

./lib-a
./lib-b (depending on lib-a)

每个目录都包含一个CMakeLists.txt用于生成自己的库的文件。我正在使用源外构建策略。

为了说 lib-b 依赖于 lib-a,我根据官方 CMake 教程add_subdirectory(../lib-a lib-a)所教的内容,将命令放入。通过这种方式,我获得了一个子目录是在../lib-b/CMakeLists.txtlib-a./lib-b/build dir

这不是我想要的行为。我想获得的是 CMake 在生成 lib-b 时引用 lib-a,如果尚未生成 lib-a,CMake 应该使用 CMakeLists.txt 在 ./lib-a/build 内部生成它lib-a(在处理依赖项时的行为类似于 make 工具的行为)。

我还想补充一点,在我的示例中我没有使用根 CMakeLists.txt,但我想要的是 lib-b/CMakeLists.txt 声明对 lib-a 的依赖,从而使 lib-a如果尚未编译,则使用其自己的 lib-a/CMakeLists.txt 进行编译。

这是目录结构及其内容:

lib-a/
    CMakeLists.txt (for compiling lib-a)
    src/
        test.cpp
    include/
        test.hpp

lib-b/
   main.cpp
   CMakeLists.txt (for compiling lib-b; here is the point where I would like to make reference to lib-a, that I need for the generation of lib-b)

lib-b/main.cpp还包含test.hppof lib-a,因为它使用了 lib-a 的功能。这应该在规范中加以考虑lib-b/CMakeLists.txt

lib-a/CMakeLists.txtlib-b/CMakeLists.txt文件这两个的内容应该是什么?

4

1 回答 1

1

我想你误解了教程。将库链接在一起的东西是target_link_library(lib_b lib_a). 如果依赖项的名称是作为构建一部分的库,CMake 将神奇地使依赖项工作。它与子目录无关。事实上,如果我有以下目录结构:

./
./a.hpp
./a.cpp
./b.hpp
./b.cpp
./CMakeLists.txt

以下将很好地设置依赖项:

PROJECT(lib_a)
ADD_LIBRARY(lib_a a.hpp a.cpp)
PROJECT(lib_b)
ADD_LIBRARY(lib_b b.hpp b.cpp)
TARGET_LINK_LIBRARIES(lib_b lib_a)

这也适用于子目录项目:

 ./
 ./CMakeLists.txt
 ./lib_a/CMakeLists.txt
 ./lib_a/a.hpp
 ./lib_a/a.cpp
 ./lib_b/CMakeLists.txt
 ./lib_b/b.hpp
 ./lib_b/b.cpp

和列表文件:

 # ./CMakeLists.txt
 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 ADD_SUBDIRECTORY(lib_a)
 ADD_SUBDIRECTORY(lib_b)

 # ./lib_a/CMakeLists.txt
 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 PROJECT(lib_a)
 ADD_LIBRARY(lib_a a.hpp a.cpp)

 # ./lib_b/CMakeLists.txt
 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 PROJECT(lib_b)
 INCLUDE_DIRECTORIES(${lib_a_SOURCE_DIR})
 ADD_LIBRARY(lib_b b.hpp b.cpp)
 TARGET_LINK_LIBRARIES(lib_b lib_a)
于 2014-11-18T17:49:12.447 回答