我正在使用C ++和Qt Creator进行编程。我需要在项目文件夹中包含我正在使用的库,以便程序可以在任何设备上实现。我该怎么办?
我知道我应该修改.pro
文件,我已经尝试过了:
LIBS+=-L"$$_PRO_FILE_PWD_/libs" \
-lvl \
但它不起作用。我收到此错误: 加载共享库时出错:libvl.so:无法打开共享对象文件:没有这样的文件或目录
任何想法? 感谢
答案 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
处理完毕。 RPATH
和RUNPATH
可用于模拟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}
start.sh
,它为您执行上述操作,然后只执行shell脚本./start.sh