我创建了cmake目标,比如说A
,并想要安装它并创建一个Config文件,这样安装的软件包就可以重定位了。我的代码是:
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ??? )
在这里,我遇到了正确目的地的问题。我希望在${CMAKE_INSTALL_PREFIX}
指向的位置安装Config文件。但是当我将${CMAKE_INSTALL_PREFIX}
放在???
时,生成的ATargets.cmake
文件包含以下行:
set(_IMPORT_PREFIX "C:/Libraries/...")
这是${CMAKE_INSTALL_PREFIX}
的实际值。稍后将_IMPORT_PREFIX
添加到自动生成的set_target_properties()
内的ATargets.cmake
命令的参数之前,从而生成硬编码路径,仅在安装系统上有效。
我尝试使用<$IMPORT_PREFIX>
之类的某些生成器表达式来代替???
,但这在cmake生成时给了我一个错误。我还试图省略DESTINATION
,我认为应该将文件放在相对于${CMAKE_INSTALL_PREFIX}
的位置,但是cmake也抱怨它。
你可以帮我解决这个问题吗?
答案 0 :(得分:1)
这是一个老问题,所以您可能已经解决了(或放弃了)。
我认为关键是导出DESTINATION匹配给INSTALL_DESTINATION到configure_package_config_file()的那个。
我们正在使用的是:
install(TARGETS
foobar
EXPORT foobarLibTargets
LIBRARY DESTINATION lib)
set(ConfigFileInstallDir lib/cmake/foobar)
set(INCLUDE_INSTALL_DIR include)
set(LIBRARY_INSTALL_DIR lib)
configure_package_config_file(src/main/cmake/foobarConfig.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/foobarConfig.cmake"
INSTALL_DESTINATION "${ConfigFileInstallDir}"
PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/foobarConfigVersion.cmake"
VERSION "${VERSION}"
COMPATIBILITY ExactVersion)
export(EXPORT foobarLibTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/foobarLibTargets.cmake")
install(EXPORT foobarLibTargets
FILE foobarLibTargets.cmake
DESTINATION "${ConfigFileInstallDir}")
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/foobarConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/foobarConfigVersion.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/foobarLibTargets.cmake"
DESTINATION "${ConfigFileInstallDir}")
$ {ConfigFileInstallDir}被_IMPORT_PREFIX自动替换 这样生成的foobarLibTargets.cmake包含以下内容:
set_property(TARGET foobar APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(foobar PROPERTIES
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/foobar.so.2.0.0"
IMPORTED_SONAME_RELEASE "libfoobar.so.2"
)
使此功能工作可能会遇到麻烦。看到我的问题:
在不久的将来在病房里见到您,您将发现与cmake相关的神经疾病...