【问题标题】:How to specify LD_LIBRARY_PATH via add_custom_command?如何通过 add_custom_command 指定 LD_LIBRARY_PATH?
【发布时间】:2018-12-18 21:35:23
【问题描述】:

我正在尝试通过 cmake 添加 ld_library_path。

到目前为止我所做的是

add_custom_command(TARGET ${target}
   POST_BUILD
   COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${PROJECT_BINARY_DIR}/bin
   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
   COMMAND $<TARGET_FILE:${target}>
   ################ ENV Set here ####################
   -E env "LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_SOURCE_DIR}/boost_linux/lib"

   COMMENT "Running Tests Now .. " VERBATIM
)

但我在运行时仍然遇到链接错误。有谁知道如何正确链接库路径。

在 bash 中它会像 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/path/to/lib

【问题讨论】:

  • add_custom_command 环境变量的设置方式与add_custom_target 相同。请注意,您的代码中的 ${LD_LIBRARY_PATH} 指的是 CMake 变量,而不是环境变量。如需引用环境变量,请使用$ENV{LD_LIBRARY_PATH}
  • ENVIRONMENT LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:/path/to/lib 仍然不起作用。
  • ENVIRONMENT 没有add_custom_command 选项,您可以在documentation 中查看。只需使用引用问题的答案即可。
  • 你错误地解释了that answer:你需要COMMAND ${CMAKE_COMMAND} -E env "LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_SOURCE_DIR}/path/to/lib" $&lt;TARGET_FILE:${target}&gt;。另请注意,LD_LIBRARY_PATH 只会在命令执行期间在 build 阶段更改。您无法使用CMakeLists.txt 中的message() 命令观察到这种变化,该命令在配置 阶段执行。

标签: linux cmake


【解决方案1】:

目前尚不清楚您到底要达到什么目标,以及它与链接错误有何关系。但是使用自定义环境变量运行命令的方式如下:

add_custom_command(
  ...
  COMMAND ${CMAKE_COMMAND} -E env "LD_LIBRARY_PATH=..."
    actual command line that you need to execute
)

因此,-E env 的工作方式是执行在 env 变量规范之后传递的任何内容。

但是,请注意,您不能使用多个 COMMAND 参数并在第一个参数中设置 env,同时在以下 COMMANDs 中使用它 - 它不起作用。或者,至少,它依赖于生成器。使用 Make 后端,这被转换为对 shell 的多次调用——因此它设置了环境,但其余命令是单独执行的,看不到它。 Ninja 生成器将多个 COMMANDs 转换为 cmd1 &amp;&amp; cmd2 &amp;&amp; ... 之类的东西,因此它可以在那里工作,AFAIK。

【讨论】:

  • 我实际上是在尝试在创建 uni test 可执行文件后运行它,而 `COMMAND $` 命令会为我执行此操作。我这样做是为了让 cmake 在 cmake 构建期间运行我的单元测试可执行文件。
  • 好吧,这与自定义命令的主题无关,但我建议使用add_test 来代替测试。在构建期间运行测试可能非常不方便。首先,完成构建需要额外的时间,而人们可能希望看到它尽快运行。其次,一个小的不稳定测试的失败将停止整个构建,即使它在其他方面功能齐全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多