我正在使用C++和Qt Creator进行编程。我需要在我的项目文件夹中包含我正在使用的库,以便程序可以在任何设备上实现。我应该怎么做?将库包含到我的项目文件夹中
我知道我应该修改.pro
文件,我已经尝试过这样的:
LIBS+=-L"$$_PRO_FILE_PWD_/libs" \
-lvl \
但它不工作。我得到这个错误: 加载共享库时出错:libvl.so:无法打开共享对象文件:没有这样的文件或目录
任何想法?? 谢谢
我正在使用C++和Qt Creator进行编程。我需要在我的项目文件夹中包含我正在使用的库,以便程序可以在任何设备上实现。我应该怎么做?将库包含到我的项目文件夹中
我知道我应该修改.pro
文件,我已经尝试过这样的:
LIBS+=-L"$$_PRO_FILE_PWD_/libs" \
-lvl \
但它不工作。我得到这个错误: 加载共享库时出错:libvl.so:无法打开共享对象文件:没有这样的文件或目录
任何想法?? 谢谢
首先,在Linux上,qmake生成用于控制构建过程的Makefiles。当您添加行
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
和man page,ldconfig
,我将其引用到相应的man page,其中ldconfig
用于以标准方式配置用户定义的库搜索路径。
当ld-linux.so.2
试图找到库,它搜索良好定义的组目录(所有冒号分隔)按以下顺序:
DT_RPATH
,其可以被写入到一个可执行库(已弃用)。LD_LIBRARY_PATH
(至少对于大多数可执行文件,看到异常的man page)DT_RPATH
(如果有的话),但延迟的查找之后才LD_LIBRARY_PATH
已被处理DT_RUNPATH
。 RPATH
和RUNPATH
可用于模拟Windows上的行为,其中也搜索可执行文件的路径。然而,LD_LIBRARy_PATH
更适合于此目的。/etc/ld.so.conf/
以及可能的附加文件中指定ldconfig
使用目录生成的高速缓存文件/etc/ld.so.cache
库名称或者通过包含直接提及的ld.so.conf
或另有规定/lib
和/usr/lib
如果上面提到的路径都不包含适当的共享对象,您将收到一个错误消息,说明它不能被ld-linux.so.2
加载。
你的情况的解决方案是简单又进来一些品种:
export LD_LIBRARY_PATH={yourSearchPaths}
的LD_LIBRARY_PATH
环境变量。LD_LIBRARY_PATH
添加到命令行上对可执行文件的调用,例如, LD_LIBRARY_PATH={yourSearchPaths} ./{executable}
start.sh
,它为你做了上面的事情,然后简单地执行shell脚本./start.sh
与没有评论的人一起投票是什么? – thokra
@ thokra ..感谢这么多的详细解释..我改变了.pro文件中的行为:'LIBS + = - L“$$ PWD/libs”-lvl“,它没有工作..我试了整个项目在另一个设备..这里是惊喜..它完美的作品..即使一切都是相同的两个设备..可能只是QT Creator版本是不同的..多谢你这么多:) – triple13
@ triple13:什么你的意思是用* device *?另外,QtCreator简单地解析相应的IDE中的'.pro'文件。 QtCreator不会在构建时或运行时贡献(除了启动可执行文件和可能指定的工作目录之外)。 – thokra
究竟是什么问题?编译器没有找到库?如果'lvl'是一个库,则需要添加一个'-l'前缀来实际将它添加到要链接的库的列表中。 – thokra
它给出了这个错误:加载共享库时出现的错误: :libvl.so:无法打开共享对象文件:没有这样的文件或目录 – triple13
@thokra是的我已经把它作为-lvl在我的程序中,但是当我复制粘贴到论坛 - 已经过去了:D – triple13