我有以下目录结构和库依赖项:
./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.txt
和lib-b/CMakeLists.txt
文件的内容应该是什么?
答案 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)