如何从CMake工具链文件中设置LD_LIBRARY_PATH?

3
在Linux上,我想为交叉编译创建一个CMake工具链文件
编译器需要一些位于非标准目录中的共享库,因此我必须在调用它之前设置LD_LIBRARY_PATH。当从命令行调用编译器时,这是有效的,但在从CMake调用时却无效。
我尝试通过从工具链文件设置set(ENV{LD_LIBRARY_PATH} "${CMAKE_CURRENT_LIST_DIR}/<shared library directory>")来设置LD_LIBRARY_PATH。然而,编译器抱怨找不到共享库。

注意:如果您为“_That worked when calling the compiler from the command line, but not when calling it from CMake._”提供一个[mre],并为“_However the compiler complained that it couldn't find the shared libraries._”提供实际的编译器诊断消息,将有助于解决问题。 - starball
1个回答

0

目录:

  1. 在工具链文件中设置不会达到你想要的效果。

  2. 我不确定在调用构建系统之前设置LD_LIBRARY_PATH为什么对你没有起作用。

  3. CMake中有一种更符合习惯的方法可以实现你想要的功能。

在工具链文件中设置不会达到你想要的效果

我非常确定你询问如何采取的方法不会起作用,因为set(ENV)只是设置一个环境变量,这个变量只能在CMake配置阶段(而不是构建阶段)被识别。以下是minimal reproducible example

CMakeLists.txt:

cmake_minimum_required(VERSION 3.23)
project(Foo)
set(ENV{FOO} "hello world!")
message("\$ENV{FOO} at configure time: $ENV{FOO}")
add_custom_target(echo
  "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/echo.cmake"
  VERBATIM
)

echo.cmake:

cmake_minimum_required(VERSION 3.23)
message("\$ENV{FOO} at build time: $ENV{FOO}")

运行以下代码:

$ cmake -S . -B build --fresh
<...>
$ENV{FOO} at configure time: hello world!
<...>

$ cmake --build build/ --target echo
$ENV{FOO} at build time: 

由于环境变量是向子进程而不是向上传递的,因此当您执行set(ENV)时,它只是在执行配置步骤(在上面的示例中由cmake -S ...命令调用的CMake进程)中进行设置。正如示例所示,CMake在构建时不会采取任何花哨的方法来使这些环境变量在其配置时间对生成的构建系统可知。

我不确定为什么在调用构建系统之前设置LD_LIBRARY_PATH对您没有起作用

所以我必须在调用它之前设置LD_LIBRARY_PATH。从命令行调用编译器时可以工作,但从CMake中无法工作。

只要您将变量导出以便它可供shell的子进程使用(使用您正在使用的任何shell的正确机制),那就应该可以工作。一个最小可重现示例会在这里有所帮助。

CMake中有更符合习惯的方法来实现您想要的功能

尝试使用 find_library() 命令。它在配置时间(而不是构建时间)做了它名字所说的事情。如果你使用它,你还将获得构建系统更加跨平台的好处。

它有几种调整搜索库的方式。你可以在官方文档中详细了解它的工作原理。

对于你的情况,一个适合指导库搜索的配置点可能是 CMAKE_LIBRARY_PATH 变量,尽管正如你将在文档中阅读到的,还有其他配置点也可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接