如何解决CMake:使用ExternalProject_Add
我有一个小项目,其CMakeLists.txt
看起来像这样:
include(ExternalProject)
ExternalProject_Add(gainput_project
PREFIX gainput
GIT_REPOSITORY https://github.com/jkuhlmann/gainput.git
GIT_TAG e21b15f0bc3dd3f1a745fe89a966a2457e940142
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(gainput_project SOURCE_DIR)
ExternalProject_Get_Property(gainput_project BINARY_DIR)
set(GAINPUT_SOURCE_DIR "${SOURCE_DIR}")
set(GAINPUT_BINARY_DIR "${BINARY_DIR}")
add_executable(demo main.cpp)
add_dependencies(demo gainput_project)
target_include_directories(demo PUBLIC
SYSTEM ${GAINPUT_SOURCE_DIR}/lib/include
)
# TODO: this is bad
if(WIN32)
target_link_libraries(demo PUBLIC
debug ${GAINPUT_BINARY_DIR}/lib/Debug/gainput-d.lib
optimized ${GAINPUT_BINARY_DIR}/lib/Release/gainput.lib
)
else()
target_link_libraries(demo PUBLIC
debug ${GAINPUT_BINARY_DIR}/lib/gainput-d.so
optimized ${GAINPUT_BINARY_DIR}/lib/gainput.so
)
endif()
很显然,对target_link_libraries
的调用并不理想;它们非常重复,我明确地编写了构建系统应该已经知道的路径和文件名。 处理外部项目中不同的输出目录和文件名的最佳方法是什么?
有没有一种方法可以查询外部项目以获取 actual 输出目录? (例如,通过ExternalProject_Get_Property
吗?)我可以使用一些神奇的生成器表达式吗? (ExternalProject_Get_Property(gainput_project RUNTIME_OUTPUT_DIRECTORY)
不起作用。)
似乎find_library
可以工作,除了,在配置时输出库不存在,因此失败。
也许我应该将外部项目的INSTALL_DIR
设置为我控制的某个硬编码目录,并始终使用该目录? (是否还会在Windows上获得Debug
和Release
子目录?)
FetchContent
模块是否可以使我更好地访问所包含项目的输出?我在那里的文档中看不到任何明显的东西。
Idk,我已经尝试了很多想法,但到目前为止没有任何效果。我觉得我可能缺少一些基本知识-这是我第一次使用ExternalProject
。有提示吗?
解决方法
正如@Tsyvarev所建议的,我通过从ExternalProject
切换到FetchContent
来解决此问题,然后使用生成器表达式来查找输出文件:
include(FetchContent)
FetchContent_Declare(gainput
PREFIX gainput
GIT_REPOSITORY https://github.com/jkuhlmann/gainput.git
GIT_TAG e21b15f0bc3dd3f1a745fe89a966a2457e940142
INSTALL_COMMAND ""
)
FetchContent_MakeAvailable(gainput)
add_executable(demo main.cpp)
add_dependencies(demo gainput)
target_include_directories(demo PUBLIC
SYSTEM ${gainput_SOURCE_DIR}/lib/include
)
target_link_libraries(demo PUBLIC
$<TARGET_LINKER_FILE:gainput>
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。