【问题标题】:Include libraries into my project folder将库包含到我的项目文件夹中
【发布时间】:2013-09-24 09:16:00
【问题描述】:

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

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

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

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

有什么想法吗?? 谢谢

【问题讨论】:

  • 到底是什么问题?编译器找不到库吗?如果lvl 是一个库,则需要添加一个-l 前缀才能将其实际添加到要链接的库列表中。
  • 它给出了这个错误:加载共享库时出错:libvl.so:无法打开共享对象文件:没有这样的文件或目录
  • @thokra 是的,我已经将它作为 -lvl 在我的程序中,但是当我将复制粘贴到论坛中时 - 消失了:D
  • 我已经更正了问题
  • @triple13:嗯,显然 liblv 不在$$_PRO_FILE_PWD_/libs。发出一条消息并打印路径并检查该字段是否存在于您期望它存在的位置。

标签: c++ qt-creator libraries


【解决方案1】:

首先,在 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 pageldconfig 对应的man page,用于以标准方式配置用户定义的库搜索路径。

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加载。

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

  • 在执行程序之前,使用export LD_LIBRARY_PATH={yourSearchPaths}设置LD_LIBRARY_PATH环境变量。
  • LD_LIBRARY_PATH 添加到命令行上的可执行文件的调用中,例如LD_LIBRARY_PATH={yourSearchPaths} ./{executable}
  • 提供可执行的启动 shell 脚本,例如start.sh,它会为您完成上述操作,然后只需执行 shell 脚本 ./start.sh

【讨论】:

  • 人们在没有评论的情况下投反对票是怎么回事?
  • @thokra..非常感谢您的详细解释..我将 .pro 文件中的行更改为:'LIBS+=-L"$$PWD/libs" -lvl' 确实如此不工作..我在另一台设备上尝试了整个项目..这是惊喜..它工作得很好..即使两个设备上的一切都是一样的..也许只是 QT Creator 版本不同..无论如何非常感谢:)
  • @triple13:device 是什么意思?此外,QtCreator 只需解析 .pro 文件并在 IDE 中进行相应的处理。 QtCreator在构建时或运行时贡献(除了启动可执行文件并可能指定工作目录)。
  • @thokra..通过设备我的意思是另一台机器..另一台计算机..我尝试了相同的项目并且它有效
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2013-03-17
  • 2018-05-14
  • 1970-01-01
  • 2016-03-15
  • 2015-05-07
相关资源
最近更新 更多