目标输出文件的路径

Dmi*_*erg 45 cmake

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

Fra*_*ser 47

您应该为此使用生成器表达式.

从文档for add_custom_command和生成器表达式的文档:

参数COMMAND可以使用"发电机表达" ...

在构建系统生成期间评估生成器表达式,以生成特定于每个构建配置的信息.

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

$<TARGET_FILE:MyLib>
Run Code Online (Sandbox Code Playgroud)

  • 是的,要调用一个宏,你需要将它添加到一个独立的CMake脚本文件中,并使用`-P` arg从命令调用CMake.缺点(除了过于复杂)是脚本文件中的宏无法访问主CMake进程中的任何当前变量 - 在调用CMake时也需要传递它们.所以例如`add_custom_command(... COMMAND $ {CMAKE_COMMAND} -DCMAKE_BUILD_TYPE = $ {CMAKE_BUILD_TYPE} -P"path/to/script_with_macro.cmake") (2认同)

bgo*_*odr 24

尝试:

get_property(fancy_lib_location TARGET fancy_lib PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
Run Code Online (Sandbox Code Playgroud)

fancy_lib创建目标的位置在哪里add_library (fancy_lib SHARED ...).

我发现它直接与Makefile生成器一起工作,但是Visual Studio生成器还有很多工作要做,因为它的值fancy_lib_location不是你所期望的:

  1. fancy_lib_location将包含对Visual-Studio特定$(OutDir)引用的嵌入式引用,您必须将其替换为CMAKE_BUILD_TYPECMake变量的值(它解析为类似的Debug,或者Release).
  2. 至少对于CMake 2.8.1,至少在Visual Studio目标上,如果你设置了CMAKE_DEBUG_POSTFIX变量,那么它将包含在值中(这可能是也可能不是bug,我不知道).

  • Cmake 3.0及更高版本中的策略[CMP0026](http://www.cmake.org/cmake/help/v3.0/policy/CMP0026.htm)不允许以这种方式使用LOCATION属性.生成器表达方法是优选的. (11认同)
  • @Ose不幸的是,$ {CMAKE_BUILD_TYPE}仅在基于make的生成器中受支持,因此在使用像Visual Studio这样的IDE时,您的解决方案可能会中断. (3认同)
  • 对于第1点,您可以使用"LOCATION"的每个配置版本,即"LOCATION_DEBUG","LOCATION_RELEASE"等.这将完全解析路径.对于第2点,这似乎固定在v2.8.10 (2认同)
  • @harish我已经很多年没有使用过cmake了,所以我的答案现在可能已经严重过时了,因此现在“陈旧”。 (2认同)