cmake:对象库的依赖

时间:2018-01-17 17:51:55

标签: cmake

假设以下目录strcuture:

CMakeLists.txt
libA
    contents: a.cpp 
              a.h
src
    contents: hello.cpp
              target1.cpp
              target2.cpp
include
    - contents: hello.h

我有一个静态库 A ,在项目的主要源代码中使用。

尝试1

. . .
add_executable(t1 src/target1.cpp src/hello.cpp)
add_dependancies(libA)
target_include_directories(t1 PRIVATE ${PROJECT_SOURCE_DIR}/include
target_link_libraries(t1 PRIVATE /path/to/libA)
. . .

这适用于t1,但是,如果我想编译target2.cpp,我需要重复此过程,因此生成hello.o两次。

尝试2 : 我正在考虑更改此方法以生成hello.cpp的对象库,并简单地将对象库添加到目标。然而,我遇到编译问题,因为它找不到库 A 中定义的头文件,因为首先编译对象库并且尚未将heade文件复制到CMakeFiles

. . .
add_library(libA src/hello.cpp)
add_executable(t1 src/target1.cpp $<TARGET_OBJECTS:libA>)
add_dependancies(libA)
target_include_directories(t1 PRIVATE ${PROJECT_SOURCE_DIR}/include
target_link_libraries(t1 PRIVATE /path/to/libA)
. . .

有没有办法定义依赖性,以便之前编译静态库 A

1 个答案:

答案 0 :(得分:2)

在评论中,您提到libA实际上是使用ExternalProject_Add引入构建系统的。这意味着您在同一CMakeLists.txt中混合了“普通”项目和外部项目,这是非常沮丧的。

使用ExternalProject的首选方法是所谓的Superbuild方法:将 all 项目视为外部项目,并使用ExternalProject_Add添加它们,包括您自己的项目。这样,主CMakeList就变成了superbuild - 子项目的容器和驱动程序。在此级别,您可以根据需要在各个项目之间引入依赖关系。

配置并构建一次superbuild以正确设置所有项目。之后,降低一级并对项目进行处理,就好像它是独立的一样;所有依赖关系都已准备就绪。