我有一个CMake项目,其中包含两个子模块A
和B
。 B
依赖于A
。在子模块B
中,我想使用find_package(A CONFIG)
查找A
。我的最小(不)工作示例如下:
CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
project(AB)
add_subdirectory(B)
add_subdirectory(A)
A/CMakeLists.txt:
message(STATUS "CMake: A")
add_library(A SHARED A.hpp A.cpp)
target_include_directories(A PUBLIC "${CURRENT_SOURCE_DIR}")
install(TARGETS A EXPORT AA LIBRARY DESTINATION lib/)
export(TARGETS A NAMESPACE AA:: FILE ${CMAKE_BINARY_DIR}/A/AConfig.cmake)
export(PACKAGE AA)
A/A.hpp (some non-sense code)
A/A.cpp
B/CMakeLists.txt
find_package(A CONFIG)
message(STATUS "---> ${A_FOUND}")
add_library(B B.hpp B.cpp)
target_link_libraries(B AA::A)
B/B.hpp (some non-sense code)
B/B.cpp
A/CMakeList.txt
正确生成了 AConfig.cmake
文件。但是据我了解,它是在调用 find_package(A CONFIG)
之后才这样做的,因此无法找到 AConfig.cmake
文件。
你有什么想法可以强制让 find_package()
在执行 A
之后运行吗?
当然,我知道在这个例子中使用 find_package
没有任何意义。在我的实际项目中,子模块是外部软件,我不想修改它们(在我的情况下是 parallelSTL 和 TBB)。
find_package(A)
前,您需要安装或者构建项目A
。由于构建是在配置阶段完成后进行的,即在处理CMakeLists.txt
脚本时,您不能同时使用add_subdirectory
包含两个项目并期望它们能正常工作。要立即构建项目A
,您可以使用execute_process
命令。 - Tsyvarevadd_subdirectory(B)
和add_subdirectory(A)
的顺序调换一下? - Bingoabs