2013-09-24 99 views
0

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

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

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

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

任何想法?? 谢谢

+0

究竟是什么问题?编译器没有找到库?如果'lvl'是一个库,则需要添加一个'-l'前缀来实际将它添加到要链接的库的列表中。 – thokra

+0

它给出了这个错误:加载共享库时出现的错误: :libvl.so:无法打开共享对象文件:没有这样的文件或目录 – triple13

+0

@thokra是的我已经把它作为-lvl在我的程序中,但是当我复制粘贴到论坛 - 已经过去了:D – triple13

回答

0

首先,在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.2man page,ldconfig,我将其引用到相应的man page,其中ldconfig用于以标准方式配置用户定义的库搜索路径。

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

  • 如果存在的话,所谓的DT_RPATH,其可以被写入到一个可执行库(已弃用)。
  • LD_LIBRARY_PATH(至少对于大多数可执行文件,看到异常的man page)
  • 它取代了DT_RPATH(如果有的话),但延迟的查找之后才LD_LIBRARY_PATH已被处理DT_RUNPATHRPATHRUNPATH可用于模拟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}
  • 提供可执行的启动shell脚本,例如, start.sh,它为你做了上面的事情,然后简单地执行shell脚本./start.sh
+0

与没有评论的人一起投票是什么? – thokra

+0

@ thokra ..感谢这么多的详细解释..我改变了.pro文件中的行为:'LIBS + = - L“$$ PWD/libs”-lvl“,它没有工作..我试了整个项目在另一个设备..这里是惊喜..它完美的作品..即使一切都是相同的两个设备..可能只是QT Creator版本是不同的..多谢你这么多:) – triple13

+0

@ triple13:什么你的意思是用* device *?另外,QtCreator简单地解析相应的IDE中的'.pro'文件。 QtCreator不会在构建时或运行时贡献(除了启动可执行文件和可能指定的工作目录之外)。 – thokra

相关问题