我正在使用Qt Creator(2.1 RC)在Linux中开发Qt应用程序.我创建了2个项目,并使用向导将库项目添加到应用程序项目中.但是,当我运行它时,我收到错误:
/home/jakepetroules/silverlock/silverlock-build-desktop/desktop/silverlock: error while loading shared libraries: libsilverlocklib.so.1: cannot open shared object file: No such file or directory
我可以设置一些qmake变量,以便Qt Creator能够正确设置环境来运行吗?使用启动器脚本将所有文件复制到另一个目录只是为了能够测试构建,这非常烦人.在Windows上,它运行良好 - Qt Creator在运行应用程序时自动将包含DLL的目录添加到PATH(从资源管理器运行它会说DLL未找到).Mac OS X更糟糕,不得不在所有东西上运行install_name_tool ......
那么如何设置我的qmake文件以便一切正常从Qt Creator中的运行按钮开始?没有这种能力也难以调试.
对于由ldd标识的依赖项,我如何知道它是使用二进制文件的RPATH还是环境的LD_LIBRARY_PATH?
我不明白为什么当 -L 已经告诉共享库路径在哪里时有必要提供 rpath 或使用 LD_LIBRARY_PATH 设置环境变量。
这个答案说: -L 告诉 ld在链接时在哪里寻找要链接的库。
但为什么同时相应的-rpath没有自动设置呢?为什么我们需要再次手动执行?
PS:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但如果是这样,那么ld在链接过程中实际上做了什么,或者如果其他环境中的 -rpath 不同,为什么需要给出 -L 路径。
假设我的平台是使用GNU构建工具链(GCC等)的vanilla(非嵌入式)x86-64 Linux.
要指定$ORIGIN
的RPATH
,我知道的链接器选项:-Wl,-rpath,'\$\$ORIGIN'
.
今天,我发现了另一种选择:-Wl,-z,origin
.
使用时我应该总是包括在内吗?-Wl,-z,origin
-Wl,-rpath,'\$\$ORIGIN'
官方GNU ld文档,说:
标记对象可能包含$ ORIGIN.
相关但不同:https://stackoverflow.com/questions/33853271/what-are-the-recommended-gnu-linker-options-to-specify-rpath
正如标题所解释的,我正在尝试将 FFMPEG 与我的可执行应用程序捆绑在一起。
但是,我似乎无法弄清楚 FFMPEG 共享库的运行时加载。我不确定什么是不正确的:
RPATH/RUNPATH
主要项目和 FFMPEG 库。这是一个 CMake 项目,希望最终找到一个“标准解决方案”,我将包含重现此问题所需的所有内容。
cmake_minimum_required(VERSION 3.21) # Required for the install(RUNTIME_DEPENDENCY_SET...) subcommand
project(cmake-demo LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_CXX_EXTENSIONS NO)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN YES)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Setup CMAKE_PREFIX_PATH for `find_package`
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_LIST_DIR}/vendor/install)
find_package(PkgConfig REQUIRED)
pkg_check_modules(ffmpeg REQUIRED IMPORTED_TARGET libavdevice libavfilter libavformat libavcodec
libswresample libswscale libavutil)
# Setup variable representing the vendor install directory
set(VENDOR_PATH ${CMAKE_CURRENT_LIST_DIR}/vendor/install)
# Set RPATH to the dependency install tree
set(CMAKE_INSTALL_RPATH …
Run Code Online (Sandbox Code Playgroud) 我使用google-perf工具(tcmalloc)库编译了Python 2.6.6,以消除我使用默认2.6.5时遇到的一些内存问题.在获得2.6.6之后它似乎无法工作,因为我认为在Ubuntu中存在默认2.6.5安装问题.从wxPython和setuptools这样的软件通道安装的二进制文件是否都不能正常使用2.6.6.这些需要重新编译吗?任何其他建议,以使其顺利运作.我可以在不更改路径的情况下将2.6.5设置为默认值吗?该路径首先在usr/local/bin中查找.
我在Xcode中有一个项目,我在环境变量窗格中设置了DYLD_FALLBACK_LIBRARY_PATH,以设置我的应用程序应该查找要链接到的库的位置(这对我来说很有用)
我正在编写一个CMakeLists.txt文件来生成这个项目,我想从脚本中设置这个属性.
我知道我可以这样做:
SET(ENV{DYLD_FALLBACK_LIBRARY_PATH} ${DYLD_FALLBACK_LIBRARY_PATH} /path/to/lib)
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时我得到这个错误:
'dyld: Library not loaded ... Reason: image not found'
Run Code Online (Sandbox Code Playgroud)
启动应用程序时.我想这句话不一样.
有人知道如何从CMakeLists.txt中获得与Xcode相同的功能吗?
我隐约知道CMake RPATH的东西,但如果可能的话,我宁愿避免这种情况.
感谢您的时间!
干杯!
汤姆
我正在尝试在 MacOS 上使用 Autotools 构建一个框架。该框架包含一个库(我们称之为 libmytools.dylib)和一个使用该库的可执行文件。我想要的是在运行时动态链接这个库。
可执行文件通常安装到/Library/Frameworks/mytools.Framework/Versions/Current/Commands/mytools
库通常安装到
/Library/Frameworks/mytools.Framework/Versions/Current/Libraries/libmytools.dylib
如果框架安装在该位置,一切正常,但是当框架未安装在计算机上而是仅嵌入到另一个项目中时,则无法找到该库。
我需要的是所谓的“Runpath Dependent Library”,如下所述: https ://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html
所以我所做的就是添加mytools_LDFLAGS = -rpath @executable_path/../Libraries
到 makefile 中。
但不幸的是 libtool 拒绝将我的可执行文件与动态 -rpath 链接并显示以下错误:libtool: link: only absolute run-paths are allowed.
我也尝试过mytools_LDFLAGS = -dynamic -rpath @executable_path/../Libraries
,但结果是一样的......
我究竟做错了什么??
尝试构建一个完全独立的OTP,可以独立于系统上安装的库移动.
从源代码构建OpenSSL 1.0.0d如下:
./config --prefix=<open-ssl-dir>
make
make install
Run Code Online (Sandbox Code Playgroud)
那么OTP R14B03:
./configure --prefix=<erlang-dir> --with-ssl=<open-ssl-dir> --without-termcap
Run Code Online (Sandbox Code Playgroud)
然后Erlang的make失败如下:
relocation R_X86_64_32 against `OPENSSL_ia32cap_P' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)
我们正在谈论Ubuntu 10.04.任何帮助非常感谢 - 谢谢!
我有一个 Linux 共享对象,它与一些共享对象动态链接,其中一些又与其他共享对象进一步动态链接,需要间接动态链接。为了找到这些 SO,我通过将链接器标志传递给 G++ 将 RPATH 标头嵌入到我的顶级 SO 中,如下所示:
-Xlinker -rpath -Xlinker $ORIGIN/../my/libs
Run Code Online (Sandbox Code Playgroud)
这适用于 Ubuntu 16.04 和 CentOS 7.x(使用来自 DevToolset 7 的 G++ 7.3)。但是,在 Ubuntu 18.04 上执行此构建时,它会嵌入一个 RUNPATH 标头。与 RPATH 不同,RUNPATH 仅用于查找我的顶级 SO 所需的 SO,而不考虑它们所需的后续 SO 的间接动态链接。
我已经确认从 RPATH 到 RUNPATH 的更改导致了这个问题。当我使用在 Ubuntu 16.04 上构建的具有 RPATH 标头的 SO 时,间接链接可以正常工作。当我使用chrpath -c将 RPATH 标头更改为 RUNPATH 标头时,间接链接在 Ubuntu 18.04 和 Ubuntu 16.04 上都会中断。
如何让链接器在 Ubuntu 18.04 上使用 RPATH?或者,如何完成chrpath -c的逆操作- 将 …