gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:21:19 27 4
gpt4 key购买 nike

在 Linux 上,我想创建一个 CMake toolchain file用于交叉编译。

编译器需要一些位于非标准目录中的共享库,因此我必须设置 LD_LIBRARY_PATH在调用它之前。这在从命令行调用编译器时有效,但在从 CMake 调用时无效。

我尝试设置 LD_LIBRARY_PATH通过set(ENV{LD_LIBRARY_PATH} "${CMAKE_CURRENT_LIST_DIR}/<shared library directory>")从工具链文件。然而,编译器提示找不到共享库。

最佳答案

目录:

  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
)

回声.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 进程中设置它通过上面示例中的 cmake -S ... 命令)。如示例所示,CMake 不会做任何花哨的事情来让这些环境变量在其配置时为构建时生成的构建系统所知。

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

So I have to set LD_LIBRARY_PATH before invoking it. It works when calling the compiler from the command line, but not from CMake.

只要你是exporting使其可用于 shell 的子进程的变量(对您正在使用的任何 shell 使用正确的机制)应该可以工作。 minimal reproducible example在这里会有所帮助。

在 CMake 中有一种更惯用的方式来做你想做的事

尝试使用 the find_library() command .它按照其名称所说的那样在配置时(而不是构建时)执行操作。如果您使用它,您还将受益于构建系统更加跨平台。

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

对于您的情况,指导图书馆搜索的合适配置点之一是 the CMAKE_LIBRARY_PATH variable ,尽管正如您将读到的那样,您还可以使用其他配置点。

关于linux - 如何从 CMake 工具链文件设置 LD_LIBRARY_PATH?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56965029/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com