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宏中使用,$
。生成器表达式仅作为与“生成”步骤相关的一些函数的参数。如果