似乎这个问题以前经常被问到,但似乎没有一个解决方案适用于我的情况。
我在一个CMake/Linux环境中,必须在build步骤(特别是protoc
)运行一个可执行的二进制文件。
此二进制文件需要一个库,但它未安装(也无法安装)在标准目录(如/usr
)中,因此无法找到该库。
不幸的是,我无法操作protoc
调用,因为它嵌入在第三方脚本中。
我现在可以在每个make
之前设置LD_LIBRARY_PATH
,或者在系统范围内设置它,但是这非常不方便,特别是当涉及到构建发生的IDE或者具有连续构建环境的分布式构建场景时。
我尝试通过设置LD_LIBRARY_PATH
set(ENV{LD_LIBRARY_PATH} "/path/to/library/dir")
但这似乎在构建步骤中没有效果。
所以我的问题是:我可以在CMake中设置一个在构建过程中使用的库搜索路径吗?
3条答案
按热度按时间eyh26e7m1#
试试这个
我还用这个卑鄙的伎俩临时改变了一些环境变量:
执行此行后,当前shell中的
LD_LIBRARY_PATH
不会发生更改。另外,我认为在调用
cmake
之前更改LD_LIBRARY_PATH
也不错:export LD_LIBRARY_PATH=...
它不会改变系统范围内的任何东西,但是它将用于当前的shell和当前的构建过程,这同样适用于CI构建。您可以保存该变量,并在
cmake
调用后恢复它:qybjjes12#
我最近遇到了一个类似的问题。我的解决方案是在每个命令中加入一个设置适当环境的源文件。例如,下面的自定义命令:
会变成:
显然,这有一些缺点:
我的CMake-Fu已经被证明不足以找到一个语法上更好的方法来做这件事,但也许有人可以评论一个更好的方法。
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,等等