我使用find_package()
找到一些库。我怎么知道它定义了哪些变量,所以我可以用它们来链接那个库?
例如,CMake成功运行了以下CMakeLists.txt
,但make
在链接阶段失败,因为${DOCOPT_LIBRARIES}
为空。
cmake_minimum_required(VERSION 3.1)
project(test)
set(PROJECT_LIBS "")
find_package(docopt REQUIRED)
include_directories(${DOCOPT_INCLUDE_DIRS})
set(PROJECT_LIBS ${PROJECT_LIBS} ${DOCOPT_LIBRARIES})
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS})
但我不知道还有什么可以尝试?
答案 0 :(得分:1)
find_package(XXX)
结果的使用取决于此命令实际使用的脚本:
FindXXX.cmake
。
此文件随想要使用它的项目一起提供,或与CMake一起提供。通常,这样的"查找"脚本首先描述了它们的用法。
XXXConfig.cmake
或xxx-config.cmake
。
"配置"脚本通常随包一起安装。通常,它们是由CMake使用特定的CMake commands生成的。您需要查阅软件包的文档以正确使用这些脚本。
如果包裹没有记录其使用的" Config"脚本,那么你可能只是猜测它的用法。
阅读"配置"脚本本身可能很难:CMake包含很多" sugar",这有助于实现可移植性和兼容性。
通常,"配置"脚本提供了一些 IMPORTED 库目标,可以与target_link_libraries
调用一起使用。
有人可能会扫描项目CMakeLists.txt
以获取
install(TARGETS <targets...> EXPORT ...)
此处<targets...>
表示目标,可在find_package()
调用后访问。
同时扫描类似
的行install(EXPORT ...)
如果它有 NAMESPACE 选项,那么它的值会预先包含所有导出的目标。
示例强>:
对于docopt包,其CMakeLists.txt包含一行
install(TARGETS docopt EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})
因此导出其docopt
目标。
安装导出文件
install(EXPORT ${export_name} DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/docopt")
不包含NAMESPACE选项,可以使用原始名称访问导出目标:
find_package(docopt REQUIRED)
...
add_executable(${PROJECT_NAME} main.cpp)
# Use *IMPORTED* 'docopt' target
target_link_libraries(${PROJECT_NAME} docopt)