为CMake中的生成设置链接器搜索路径

rn0zuynd  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(309)

似乎这个问题以前经常被问到,但似乎没有一个解决方案适用于我的情况。
我在一个CMake/Linux环境中,必须在build步骤(特别是protoc)运行一个可执行的二进制文件。
此二进制文件需要一个库,但它未安装(也无法安装)在标准目录(如/usr)中,因此无法找到该库。
不幸的是,我无法操作protoc调用,因为它嵌入在第三方脚本中。
我现在可以在每个make之前设置LD_LIBRARY_PATH,或者在系统范围内设置它,但是这非常不方便,特别是当涉及到构建发生的IDE或者具有连续构建环境的分布式构建场景时。
我尝试通过设置LD_LIBRARY_PATH

set(ENV{LD_LIBRARY_PATH} "/path/to/library/dir")

但这似乎在构建步骤中没有效果。
所以我的问题是:我可以在CMake中设置一个在构建过程中使用的库搜索路径吗?

eyh26e7m

eyh26e7m1#

试试这个

SET(ENV{LD_LIBRARY_PATH} "/path/to/library/dir:$ENV{LD_LIBRARY_PATH}")

我还用这个卑鄙的伎俩临时改变了一些环境变量:

LD_LIBRARY_PATH="/path/to/library/dir:$LD_LIBRARY_PATH" cmake ...

执行此行后,当前shell中的LD_LIBRARY_PATH不会发生更改。
另外,我认为在调用cmake之前更改LD_LIBRARY_PATH也不错:export LD_LIBRARY_PATH=...
它不会改变系统范围内的任何东西,但是它将用于当前的shell和当前的构建过程,这同样适用于CI构建。您可以保存该变量,并在cmake调用后恢复它:

MY_LD=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=...
cmake...
export LD_LIBRARY_PATH=$MY_LD
qybjjes1

qybjjes12#

我最近遇到了一个类似的问题。我的解决方案是在每个命令中加入一个设置适当环境的源文件。例如,下面的自定义命令:

add_custom_command(
    OUTPUT some_output
    COMMAND some_command
    ARGS some_args
    DEPENDS some_dependencies
    COMMENT "Running some_command some_args to produce some_output"
    )

会变成:

set(my_some_command_with_environment "source my_environment_script.sh && some_command")
add_custom_command(
    OUTPUT some_output
    COMMAND bash
    ARGS -c "${my_some_command_with_environment} some_args"
    DEPENDS some_dependencies
    COMMENT "Running some_command some_args to produce some_output"
    VERBATIM
    )

显然,这有一些缺点:

  • 它依赖于可用的bash shell。
  • 它为每个命令调用提供环境脚本(性能问题),您将必须更改依赖于该环境变量的所有命令调用。
  • 它改变了命令跟在COMMAND后面而参数跟在ARGS后面的常规语法,因为现在'真实的'命令是ARGS的一部分。

我的CMake-Fu已经被证明不足以找到一个语法上更好的方法来做这件事,但也许有人可以评论一个更好的方法。

gc0ot86w

gc0ot86w3#

对于第三方库提供的可执行文件,我也遇到了类似的问题。该二进制文件链接到了发行版没有提供的库,但所需的库包含在第三方库的libs目录中。
所以运行LD_LIBRARY_PATH=/path/to/thirdparty/lib /path/to/thirdparty/bin/executable是可行的。但是包配置脚本没有设置可执行文件来搜索/path/to/thirdparty/lib的运行时依赖项,所以当CMake试图运行可执行文件时,CMake会抱怨。
我通过配置一个引导脚本并将IMPORTED_LOCATION属性替换为配置的引导脚本来解决这个问题。
在CMakeLists.txt中的_第三方执行
老实说,我认为这是一个黑客和暂时停止差距,直到我修复第三方库本身。但就我所尝试的,这似乎工作在所有的IDE的我扔在它,Eclipse,VSCode,Ninja,QtCreator,等等

相关问题