假设以下目录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 ?
答案 0 :(得分:2)
在评论中,您提到libA
实际上是使用ExternalProject_Add
引入构建系统的。这意味着您在同一CMakeLists.txt
中混合了“普通”项目和外部项目,这是非常沮丧的。
使用ExternalProject的首选方法是所谓的Superbuild方法:将 all 项目视为外部项目,并使用ExternalProject_Add
添加它们,包括您自己的项目。这样,主CMakeList就变成了superbuild - 子项目的容器和驱动程序。在此级别,您可以根据需要在各个项目之间引入依赖关系。
配置并构建一次superbuild以正确设置所有项目。之后,降低一级并对项目进行处理,就好像它是独立的一样;所有依赖关系都已准备就绪。