首页 > 解决方案 > “符号查找错误:”从不同目录执行时,否则从构建目录执行时按预期工作

问题描述

我在运行 pytest 几次后出现了 Ubuntu Linux 18.04 上的一个奇怪问题。该项目主要是c++,但它也生成pybind11绑定并通过CMake生成库文件。

我的目标是强制程序将其文件输出到项目文件夹中的特定目录中,即不在可执行文件所在的同一目录中。我曾经通过运行以下命令来实现这一点:

user@computer_name:~/Dev/project$ (cd /home/user/Dev/project/unittests/test_output && "/home/user/Dev/project/./executable" -pdbin /home/user/Dev/project/unittests/test_data/3v8x.pdb -mtzin /home/user/Dev/project/unittests/test_data/3v8x_phases.mtz && cd /home/user/Dev/project)

该命令曾经按预期工作,直到今天,当我运行一些 pytest 实例时。虽然 pytest 能够成功完成所有测试,但我前面提到的命令不再起作用并给我这个错误:

user@computer_name:~/Dev/project$ /home/user/Dev/project/./executable: symbol lookup error: /home/user/Dev/project/./executable: undefined symbol: _ZN7library7Class11functionEv

但是,当我尝试在构建目录中执行可执行文件时,如下所示:

user@computer_name:~/Dev/project$ ./executable

没有任何错误,如果我尝试为程序提供输入,程序会按预期工作而不会出现任何错误。但是,它在构建目录中输出文件 - 我不希望输出去的地方。

为了进一步确认,我尝试再次从另一个目录执行程序,而不给它任何输入:

user@computer_name:~/Dev/project/unittests$ .././executable

再次遇到此错误:

.././project: symbol lookup error: .././project: undefined symbol: _ZN7library7class11functionEv

到目前为止,我已经尝试重建整个项目,生成新的 Makefile 等。

我还确认程序本身没有问题。关于如何解决此问题或将输出定向到不同文件夹而无需将特定输出参数传递给程序本身的替代方法的任何想法?

标签: c++linux

解决方案


如果你想executable拿起libexecutable.so它旁边的,你有两个选择:

  • 配置LD_LIBRARY_PATH为包含/home/user/Dev/project.
    这将使动态链接器在任何其他配置的目录之前搜索那里。
    要么在全局范围内执行此操作,要么在包装脚本中执行此操作。
  • executable使用 rpath编译。executable这将首先通过在 rpath 中查找来进行库查找。如果您传递-Wl,-rpath,'$ORIGIN'/..标志(注意 ! 周围的单引号$ORIGIN),动态链接器将始终在第libexecutable.so一个旁边找到executable

推荐阅读