目录:
在工具链文件中设置不会达到你想要的效果。
我不确定在调用构建系统之前设置LD_LIBRARY_PATH
为什么对你没有起作用。
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
变量,尽管正如你将在文档中阅读到的,还有其他配置点也可以使用。