目标输出文件的路径

时间:2010-12-03 14:05:20

标签: cmake

我有一个由add_library创建的.so库目标,需要将该库的绝对路径传递给外部脚本。现在我已${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX}LIBRARY_OUTPUT_PATH在我的CMakeLists.txt中定义)。这看起来像硬编码,因为它会在重命名目标或更改其某些属性后立即中断。有没有办法获得add_library输出的绝对路径?

3 个答案:

答案 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生成器还有很多工作要做:

  1. fancy_lib_location将包含对特定于Visual Studio的$(OutDir)引用的嵌入式引用,您必须将其替换为CMAKE_BUILD_TYPE CMake变量的值(可解析为类似DebugRelease)。
  2. 至少对于CMake 2.8.1,至少在Visual Studio目标上,如果您设置了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()