我有一个由add_library
创建的.so库目标,需要将该库的绝对路径传递给外部脚本。现在我已${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX}
(LIBRARY_OUTPUT_PATH
在我的CMakeLists.txt
中定义)。这看起来像硬编码,因为它会在重命名目标或更改其某些属性后立即中断。有没有办法获得add_library
输出的绝对路径?
答案 0 :(得分:43)
您应该使用generator expression。
来自add_custom_command
的文档和生成器表达式的文档:
COMMAND
的参数可以使用“生成器表达式”......在构建系统生成期间评估生成器表达式,以生成特定于每个构建配置的信息。
在这种情况下,假设您的库目标名为“MyLib”,表示构建库的完整路径的生成器表达式将是:
$<TARGET_FILE:MyLib>
答案 1 :(得分:22)
尝试:
get_property(fancy_lib_location TARGET fancy_lib PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
fancy_lib
是使用add_library (fancy_lib SHARED ...)
创建的目标。
我发现它直接与Makefile生成器一起工作,但是由于fancy_lib_location
的值不是您所期望的,因此Visual Studio生成器还有很多工作要做:
fancy_lib_location
将包含对特定于Visual Studio的$(OutDir)
引用的嵌入式引用,您必须将其替换为CMAKE_BUILD_TYPE
CMake变量的值(可解析为类似Debug
或Release
)。CMAKE_DEBUG_POSTFIX
变量,那么它将不包含在该值中(可能会也可能不会是一个错误,我不知道。)答案 2 :(得分:0)
要扩展@bgooddr的答案,请使用以下CMake函数来获取目标的位置:
function(get_fancy_lib_location)
set(options)
set(multiValueArgs LIB)
set(oneValueArgs LOCATION)
cmake_parse_arguments(get_fancy_lib_location "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
message (STATUS "fancy_lib == ${get_fancy_lib_location_LIB}")
get_property(fancy_lib_location TARGET "${get_fancy_lib_location_LIB}" PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
set(${get_fancy_lib_location_LOCATION} ${fancy_lib_location})
endfunction()