0

我正在使用 C++ 和 Qt Creator 进行编程。我需要在我的项目文件夹中包含我正在使用的库,以便可以在任何设备上实现该程序。我该怎么做?

我知道我应该修改.pro文件并且我已经尝试过:

LIBS+=-L"$$_PRO_FILE_PWD_/libs" \
-lvl \

但它不起作用。我收到此错误:加载共享库时出错:libvl.so:无法打开共享对象文件:没有这样的文件或目录

有任何想法吗??谢谢

4

1 回答 1

0

首先,在 Linux 上,qmake 会生成用于控制构建过程的 Makefile。添加行时

LIBS+=-L"$$_PRO_FILE_PWD_/libs" -lvl

对于您的.pro文件,qmake 将确保生成适当的 Makefile 目标,该目标告诉链接器在链接可执行文件时搜索其他库$$_PRO_FILE_PWD_/libs并链接到库。libvl.so

但是,您遇到的是运行时问题。更具体地说,ld-linux.so.2将尝试查找并动态加载共享库,例如libvl.so运行时。这在加载可执行文件时使用内置路径发生,例如/usr/lib用户定义的(和/或分发定义的)路径。我请您参考相应的手册页ld-linux.so.2手册页,用于ldconfig以标准方式配置用户定义的库搜索路径。

ld-linux.so.2尝试查找库时,它会按以下顺序搜索一组定义明确的目录(全部以冒号分隔):

  • 如果存在,即所谓DT_RPATH的 ,可以将其写入可执行库(已弃用)。
  • LD_LIBRARY_PATH至少对于大多数可执行文件,请参阅手册页以了解例外情况)
  • DT_RUNPATH取代DT_RPATH(如果有的话)但将查找延迟到处理完之后LD_LIBRARY_PATHRPATHRUNPATH可用于模拟 Windows 上的行为,其中还搜索可执行文件的路径。LD_LIBRARy_PATH但是,更适合此目的。
  • 缓存文件中存在的库名称,该文件/etc/ld.so.cache是通过ldconfig使用中指定的目录/etc/ld.so.conf/和可能的附加文件生成的,这些文件通过包含直接引用ld.so.conf或以其他方式指定
  • 信任的目录/lib以及/usr/lib

如果上面提到的路径都不包含适当的共享对象,您将收到无法加载的错误ld-linux.so.2

您的解决方案很简单,而且种类繁多:

  • 在执行程序之前,LD_LIBRARY_PATH使用 . 设置环境变量export LD_LIBRARY_PATH={yourSearchPaths}
  • 在命令行上添加LD_LIBRARY_PATH到可执行文件的调用中,例如LD_LIBRARY_PATH={yourSearchPaths} ./{executable}
  • 提供一个可执行的启动 shell 脚本,例如start.sh,它会为您执行上述操作,然后只需执行 shell-script./start.sh
于 2013-09-25T11:04:29.237 回答