【发布时间】:2015-01-30 16:58:20
【问题描述】:
我目前正在尝试让可执行文件与它所需的所有依赖项正确链接。
这是一个依赖结构的示例:
exe -> libA -> libB
exe 和 libA 有自己的存储库。 exe 拉入 libA 是这样的:
add_executable(exe ${sources})
ExternalProject_Add(
libA
GIT_REPOSITORY http://some/git/url/libA.git
...
)
target_include_directories(exe PRIVATE ${libA_includes})
target_link_libraries(exe ${libA_libs}/libA.a)
add_dependencies(exe libA)
libA 以类似的方式拉入libB:
add_library(libA STATIC ${sources})
ExternalProject_Add(
libB
URL http://some/artifact/repo/libB.tgz
...
)
target_include_directories(libA PRIVATE ${libB_includes})
target_link_libraries(libA ${libB_libs}/libB.a)
add_dependencies(libA libB)
我可以很好地构建libA,以及与libB 正确链接的测试可执行文件。但是,当我尝试构建 exe 时,它只链接到 libA 而不是 libB。如何让 CMake 知道 libA 和 libB 之间的依赖关系不应该通过 ExternalProject 丢失?
编辑:
我创建了一些依赖关系图,希望能阐明我想要什么:
实际:
我的期望:
任何帮助将不胜感激。谢谢。
编辑 2:
我最终使用以下解决方案:
在 libA 的 CMakeLists.txt 中(${MODULE_NAME} 是 libA 中某个模块的名称):
export(TARGETS ${MODULE_NAME}
NAMESPACE "${CMAKE_PROJECT_NAME}-"
APPEND FILE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-targets.cmake)
在exe的CMakeLists.txt中:
ExternalProject_Add(
libA ...
)
ExternalProject_Get_Property(libA source_dir)
ExternalProject_Get_Property(libA binary_dir)
target_include_directories(${PROJECT_NAME} PRIVATE ${source_dir})
set(LIBA_TARGETS_FILE ${binary_dir}/libA-targets.cmake)
if(EXISTS ${LIBA_TARGETS_FILE})
include(${LIBA_TARGETS_FILE})
target_link_libraries(${MODULE_NAME} libA-module_in_liba)
endif()
add_dependencies(${MODULE_NAME} libA)
注意:这确实需要使用两次运行 cmake 来构建项目,如下所示:
mkdir build; cd build
cmake .. # initial configuration
make # download the external projects
cmake .. # be able to include targets cmake file from external projects
make # this should now link everything properly
【问题讨论】:
-
我在下面的回答是没有看到图表 :-) 但我想我明白了。