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

z2acfund  于 2023-01-20  发布在  Linux
关注(0)|答案(1)|浏览(433)

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

7cjasjjr

7cjasjjr1#

目录:
1.在工具链文件中设置它并不能达到预期效果。
1.我不知道为什么在调用buildsystem之前设置LD_LIBRARY_PATH对您不起作用。
1.在CMake中有一种更惯用的方法来做你想做的事情。

在工具链文件中进行设置不会产生预期效果

我非常肯定您所问的方法不会起作用,因为set(ENV)只是设置了一个环境变量,只有在配置阶段(而不是构建阶段)CMake才知道该变量。
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进程中设置它(在上面的例子中,由cmake -S ...命令调用)。正如这个例子所示,CMake并没有做任何花哨的事情来使那些环境变量在配置时被生成的buildsystem在构建时知道。

我不知道为什么在调用buildsystem之前设置LD_LIBRARY_PATH不起作用

所以我必须在调用它之前设置LD_LIBRARY_PATH。当从命令行调用编译器时,它可以工作,但从CMake调用就不行了。
只要你导出变量使其对shell的子进程可用(无论你使用哪种shell,都使用正确的机制),这就可以了,minimal reproducible example在这里会有帮助。

在CMake中有一种更惯用的方法来执行您想要的操作

试着使用the find_library() command,它在配置时(而不是构建时)做了它的名字所说的事情,如果你使用它,你也会得到构建系统更跨平台的好处。
它有几种方法来调整它如何搜索库。你可以在官方文档中阅读它的确切工作原理。
对于这里的情况,CMAKE_LIBRARY_PATH变量是指导库搜索的一个合适的配置点,尽管您将了解到,还有其他配置点也可以使用。

相关问题