将库包含到我的项目文件夹中

时间:2013-09-24 09:16:01

标签: c++ qt-creator libraries

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

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

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

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

任何想法? 感谢

1 个答案:

答案 0 :(得分:0)

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

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

到你的.pro文件,qmake将确保生成适当的Makefile目标,告诉链接器在$$_PRO_FILE_PWD_/libs中搜索其他库并在<{1}}时链接到库libvl.so em>链接可执行文件。

但是您遇到的是运行时问题。更具体地说,ld-linux.so.2将尝试在运行时中查找并动态加载共享库,如libvl.so。当加载可执行文件时,会发生这种情况,例如/usr/lib和用户定义(和/或分发定义)路径。我推荐您使用ld-linux.so.2的{​​{3}}和ldconfig的{​​{3}},用于以标准方式配置用户定义的库搜索路径。

ld-linux.so.2尝试查找库时,它会按以下顺序搜索定义良好的目录集(所有冒号分隔):

  • 如果存在,则称为DT_RPATH,可以写入可执行库(已弃用)。
  • LD_LIBRARY_PATH(至少对于大多数可执行文件,请参阅例外的手册页)
  • DT_RUNPATH取代DT_RPATH(如果有)但延迟查找,直到LD_LIBRARY_PATH处理完毕。 RPATHRUNPATH可用于模拟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脚本./start.sh