CMake和依赖

时间:2014-11-18 10:08:19

标签: cmake build-dependencies

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

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

每个目录都包含一个CMakeLists.txt文件,用于生成自己的库。 我使用的是源外建筑政策。

为了说lib-b依赖于lib-a,我根据official CMake tutorial的教导,将命令add_subdirectory(../lib-a lib-a)放在./lib-b/CMakeLists.txt中。通过这种方式,我获得了lib-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进行编译(如果还没有)。

这是dirs结构及其内容:

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.hpp lib-a的包含,因为它使用了lib-a的函数。这应该在lib-b/CMakeLists.txt的规范中加以考虑。

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

1 个答案:

答案 0 :(得分: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)