Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 目标输出文件的路径_Cmake - Fatal编程技术网

Cmake 目标输出文件的路径

Cmake 目标输出文件的路径,cmake,Cmake,我有一个由add_library创建的.so库目标,需要将此库的绝对路径传递给外部脚本。现在我有了${LIBRARY\u OUTPUT\u PATH}/${CMAKE\u SHARED\u LIBRARY\u PREFIX}LangShared${CMAKE\u SHARED\u LIBRARY\u SUFFIX}(LIBRARY\u OUTPUT\u PATH是在我的CMakeLists.txt中定义的)。对我来说,这看起来像是硬编码,因为一旦重命名目标或更改其某些属性,它就会中断。有没有办法

我有一个由
add_library
创建的.so库目标,需要将此库的绝对路径传递给外部脚本。现在我有了
${LIBRARY\u OUTPUT\u PATH}/${CMAKE\u SHARED\u LIBRARY\u PREFIX}LangShared${CMAKE\u SHARED\u LIBRARY\u SUFFIX}
LIBRARY\u OUTPUT\u PATH
是在我的
CMakeLists.txt
中定义的)。对我来说,这看起来像是硬编码,因为一旦重命名目标或更改其某些属性,它就会中断。有没有办法获得
添加库的输出的绝对路径?

试试:

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生成器,但是Visual Studio生成器还有更多的工作要做,因为
fancy_lib_location
的值不是您所期望的:

  • fancy_lib_location
    将包含对Visual Studio特定的
    $(OutDir)
    引用的嵌入式引用,您必须将其替换为
    CMAKE_BUILD_TYPE
    CMAKE变量的值(该变量解析为
    Debug
    Release
  • 至少对于CMake 2.8.1,至少对于Visual Studio目标,如果您设置了
    CMake_DEBUG_POSTFIX
    变量,那么它将包含在值中(这可能是一个bug,也可能不是,我不知道)
  • 尝试:

    其中
    fancy_lib
    是使用
    add_library(fancy_lib SHARED…)创建的目标

    我发现它可以直接用于Makefile生成器,但是Visual Studio生成器还有更多的工作要做,因为
    fancy_lib_location
    的值不是您所期望的:

  • fancy_lib_location
    将包含对Visual Studio特定的
    $(OutDir)
    引用的嵌入式引用,您必须将其替换为
    CMAKE_BUILD_TYPE
    CMAKE变量的值(该变量解析为
    Debug
    Release
  • 至少对于CMake 2.8.1,至少对于Visual Studio目标,如果您设置了
    CMake_DEBUG_POSTFIX
    变量,那么它将包含在值中(这可能是一个bug,也可能不是,我不知道)
  • 你应该用一个字母来表示这个

    从用于生成器表达式的文档和用于生成器表达式的文档:

    命令的参数可以使用“生成器表达式”

    生成器表达式在生成生成系统期间求值,以生成特定于每个生成配置的信息

    在这种情况下,假设您的库目标名为“MyLib”,则表示构建库的完整路径的生成器表达式为:

    $<TARGET_FILE:MyLib>
    
    $
    
    对此,您应该使用

    从用于生成器表达式的文档和用于生成器表达式的文档:

    命令的参数可以使用“生成器表达式”

    生成器表达式在生成生成系统期间求值,以生成特定于每个生成配置的信息

    在这种情况下,假设您的库目标名为“MyLib”,则表示构建库的完整路径的生成器表达式为:

    $<TARGET_FILE:MyLib>
    
    $
    
    要扩展@bgoodrr的答案,这里有一个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()
    

    要扩展@bgoodrr的答案,这里有一个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()
    

    对于第1点,您可以使用每个配置版本的
    LOCATION
    ,即
    LOCATION\u DEBUG
    LOCATION\u RELEASE
    ,等等。这将完全解析路径。对于第2点,这似乎在v2.8中是固定的。10@Fraser事实上,
    位置${CMAKE_BUILD_TYPE}
    似乎涵盖了所有情况(即,即使
    ${CMAKE_BUILD_TYPE}
    为“”,它也会正确返回到发布目标的路径)。@Ose不幸的是,${CMAKE_BUILD_TYPE}仅在基于make的生成器中受支持,因此,当使用像Visual Studio这样的IDE时,您的解决方案可能会中断。Cmake 3.0及更高版本中的策略)不允许以这种方式使用LOCATION属性。首选生成器表达式方法。@harish我已经多年没有使用cmake了,因此我的答案现在可能已经严重过时,因此现在“过时”。对于第1点,您可以使用每个配置版本的
    LOCATION
    ,即
    LOCATION\u DEBUG
    LOCATION\u RELEASE
    ,等等。这完全解决了路径问题。对于第2点,这似乎在v2.8中是固定的。10@Fraser事实上,
    位置${CMAKE_BUILD_TYPE}
    似乎涵盖了所有情况(即,即使
    ${CMAKE_BUILD_TYPE}
    为“”,它也会正确返回到发布目标的路径)。@Ose不幸的是,${CMAKE_BUILD_TYPE}仅在基于make的生成器中受支持,因此,当使用像Visual Studio这样的IDE时,您的解决方案可能会中断。Cmake 3.0及更高版本中的策略)不允许以这种方式使用LOCATION属性。首选生成器表达式方法。@harish我已经多年没有使用cmake了,因此我的答案现在可能已经严重过时,因此现在变得“过时”。这非常令人沮丧,因为没有任何
    add\u custom\u[…]
    命令允许您调用宏-它们只能运行外部程序。是的,要调用宏,需要将其添加到独立的CMake脚本文件中,并使用
    -P
    参数从命令中调用CMake本身。缺点(除了过于复杂外)是脚本文件中的宏无法访问主CMake进程中的任何当前变量-调用CMake时也需要传递它们。例如
    add_custom_command(…command${CMAKE_command}-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}-P“path/to/script_with_macro.CMAKE”)
    或者,如果在CMAKE宏中使用,
    $
    。生成器表达式仅作为与“生成”步骤相关的一些函数的参数。如果