我一直在尝试使用以下rpath编译openssl 1.0.0g:
$ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)
每次我readelf -d apps/openssl,我得到的结果如下,取决于我尝试的逃避变化:
\RIGIN/../lib64
RIGIN/../lib64
ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)
我想在不使用像chrpath这样的外部工具的情况下设置我的rpath.它可能吗?我基本上会接受任何不涉及使用像chrpath这样的外部工具的东西(虽然我已经完成了).
理想情况下,我想通过在命令行(任何形式-Wl,-rpath,$ORIGIN/../lib64)上传递选项来实现.
我不介意编辑生成的Makefile,这是我最后一次尝试的.如果我能打印出一个愚蠢的美元符号!我尝试在BUILDENV =块下修改LIBRPATH而没有运气.到目前为止我的最好成绩:
LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64
Run Code Online (Sandbox Code Playgroud)
我已经阅读了各种与rpath相关的问题,并尝试了各种转义和引用技巧但到目前为止没有任何工作!
我使用的是 Mac X1,蒙特雷。
我已经安装了 Prophet,并在尝试拟合模型时遇到了这个问题。
RuntimeError: Error during optimization: console log output:
dyld[90668]: Library not loaded: @rpath/libtbb.dylib
Referenced from: /Users/{username}/opt/anaconda3/lib/python3.9/site-packages/prophet/stan_model/prophet_model.bin
Reason: tried: '/private/var/folders/cd/dfrqgp4s4ll55cwb7rtgccbw0000gq/T/pip-install-rjpuj450/prophet_d7e4cce10e414c89a572fe3605ae9269/build/lib.macosx-11.1-arm64-cpython-39/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/libtbb.dylib' (no such file), '/private/var/folders/cd/dfrqgp4s4ll55cwb7rtgccbw0000gq/T/pip-install-rjpuj450/prophet_d7e4cce10e414c89a572fe3605ae9269/build/lib.macosx-11.1-arm64-cpython-39/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/libtbb.dylib' (no such file), '/usr/local/lib/libtbb.dylib' (no such file), '/usr/lib/libtbb.dylib' (no such file)
Run Code Online (Sandbox Code Playgroud)
我知道这与搜索错误的路径有关。我可以在以下位置找到 dylib
/Users/{user}/opt/anaconda3/lib/python3.9/site-packages/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/
Run Code Online (Sandbox Code Playgroud)
但是,先知似乎不知道去看那里。我很好奇如何更新/修复 rpath 变量或找到另一个解决方案?
我尝试使用 sudo ln -s 创建符号链接,但没有笔记本电脑上的权限。
蒂亚!
我想在OSX上部署一个.dylib,它是用Delphi创建的.此.dylib应该可以由第三方应用程序加载.
这似乎是一个重复的问题,但经过大量的搜索,我找不到答案.问题与此相同:https://forums.embarcadero.com/thread.jspa?messageID = 592417
问题是.dylib需要libcgunwind.1.0.dylib,但是从第三方应用程序运行时它找不到它.作为测试,我试图复制libcgunwind.1.0.dylib到usr/lib,而且工作.当OSX无法找到.dylib时,它将始终搜索usr/lib.不幸的是,我不想将此作为最终解决方案,因为它需要提升权限,而且似乎是一种处理简单问题的繁琐方式.
仔细检查一下,我曾经otool检查过我的.dylib,它给了我以下路径:@rpath/libcgunwind.1.0.dylib.
问题是,@rpath当您的.dylib由第三方应用程序运行时,无法说明将列出哪些路径.为此,应用程序始终必须提供绝对路径libcgunwind.1.0.dylib.
显而易见的解决方案是使用install_name_tool来代替@rpath用@loader_path.如果我的逻辑是正确的,这应该导致我的.dylib总是找到libcgunwind.1.0.dylib,只要它们在同一个文件夹中.这是有道理的,因为.dylib应该负责找到自己的依赖项.
所以,我尝试了以下命令行:
install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib
并收到此消息:
install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib
我做了一些搜索此错误消息,我一直无法找到任何信息.我必须假设install_name_tool期望在gcc或llvm中构建.dylib中找到一些特定约定,并且Delphi的编译器不提供这些约定.
我在Delphi的编译器中dccosx进行了一些挖掘,并检查了Delphi发送给它的命令行参数,但是我找不到任何有用的选项.这种使用方式libcgunwind.1.0.dylib似乎是编译器隐含的,而不是我可以调整的东西.
我并不是说这是解决问题的正确方法,这些只是我尝试过的最新事情.如果您能想出一个解决问题的不同方法,请分享您的想法!
简短问题:LC_RPATH库中命令的rpath是否传递到后续(和间接)动态加载的库中?
更确切地说:我已libapi.dylib动态链接到libloader.dylib动态加载插件libplugin.dylib.我有:
$ otool -l lib/libapi.dylib
lib/libapi.dylib
libapi.dylib
/usr/lib/libSystem.B.dylib
@rpath/libloader.dylib
$ otool -l lib/libloader.dylib
lib/libloader.dylib
libloader.dylib
/usr/lib/libSystem.B.dylib
$ otool -l lib/plugins/libplugin.dylib
lib/plugins/libplugin.dylib:
libplugin.dylib
/usr/lib/libSystem.B.dylib
@rpath/libloader.dylib
$ otool -L lib/libapi.dylib | grep "LC_RPATH" -A2
cmd LC_RPATH
cmdsize 32
path @loader_path/ (offset 12)
Run Code Online (Sandbox Code Playgroud)
既不定义rpath命令libloader.dylib也不libplugin.dylib定义.并且安装名称没有任何@ rpath /或其他路径,尽管load命令中的名称前缀为@rpath /.
客户端现在加载libapi.dylib哪个链接到哪个libloader.dylib.此库动态加载libplugin.dylib链接到的库libloader.dylib.
为什么不能libplugin.dylib加载?它退出,因为它找不到libloader.dylib- 虽然它必须已经加载.为什么rpath @ loader_path/libapi.dylib没有正确地传播libloader.dylib到libplugin.dylib …
我有 Ubuntu 14.04。它附带了 openssl 1.0.1f。我想安装另一个openssl版本(1.0.2)并且我想自己编译它。
我将其配置如下:
LDFLAGS='-Wl,--export-dynamic -L/home/myhome/programs/openssl/i/lib
-L/home/myhome/programs/zlib/i/lib'
CPPFLAGS='-I/home/myhome/programs/openssl/i/include
-I/home/myhome/programs/zlib/i/include'
./config --prefix=/home/myhome/programs/openssl/i \
zlib-dynamic shared --with-zlib-lib=/home/myhome/programs/zlib/i/lib \
--with-zlib-include=/home/myhome/programs/zlib/i/include
make
make install
Run Code Online (Sandbox Code Playgroud)
安装后,当我用 检查二进制文件时ldd openssl,结果是:
...
libssl.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libssl.so.1.0.0 (0x00007f91138c0000)
libcrypto.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libcrypto.so.1.0.0 (0x00007f9113479000)
...
Run Code Online (Sandbox Code Playgroud)
看起来不错。但是当我检查 ldd 时libssl.so,结果是:
...
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fac70930000)
...
Run Code Online (Sandbox Code Playgroud)
它仍然使用系统版本的libcrypto。我尝试了不同的构建方法,但结果始终保持不变。
我的问题是如何以某种方式配置构建,使其可以对共享库的所有二进制和库依赖项进行硬编码LD_LIBRARY_PATH,而无需使用 或类似的东西。
是否有基于输出设置-rpath或 libtool 的最佳实践?我必须诉诸技巧吗?-Rpkg-configsed
我正在从openkinect的网站上进行简单的安装,以使用xbox kinect.问题是没有OSX发行版,并假设自制软件将为您安排.
在安装的最后一步,我找到了一个有用的线索,说明我的安装有什么问题.
我被网站告知."如果链接有问题,则必须使用以下命令更改每个libfreenect lib的rpath:"
for i in /opt/local/lib/libfreenect*.dylib; do sudo install_name_tool -id $i $i; done
sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/lib/libfreenect_sync.dylib
sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/lib/libfreenect_cv.dylib
sudo install_name_tool -change libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_cv.dylib
for i in glview regview hiview glpclview tiltdemo record cppview cvdemo; do sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/bin/$i; sudo install_name_tool -change libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_sync.0.2.dylib /opt/local/bin/$i; done
Run Code Online (Sandbox Code Playgroud)
我的rpath肯定设置不正确.当用CMake构建时,这个次要消息肯定证实了我的怀疑.
CMake Warning (dev):
Policy CMP0042 is not set: MACOSX_RPATH is enabled by default. Run "cmake
--help-policy CMP0042" for policy …Run Code Online (Sandbox Code Playgroud) 我花了一个星期试图让我在 Linux 上工作的东西在 OSX 上工作,但无济于事。我试过阅读关于 rpath 的 CMake 文章和其他各种关于它的 SO 帖子,并尝试使用我的 CMakeLists.txt 来让它工作,但我失败了,我希望有人能给我一些提示我做错了什么。
# CMake 2.8.11 and above required for linking to qtmain.lib library on Windows
# CMake 2.8.12 and above required for MACOSX_RPATH property
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT_NAME "maya_standalone_test")
if(APPLE)
message(STATUS "Setting MacOSX SDK...")
set(CMAKE_OSX_SYSROOT "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk")
endif(APPLE)
project(${PROJECT_NAME})
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules)
# Attempt to find existing installation of Maya and define variables
find_package(Maya REQUIRED)
# Add include search paths
include_directories(
${MAYA_INCLUDE_DIR}
${PROJECT_SOURCE_DIR}/include
)
if(APPLE)
message(STATUS "Setting OSX Framework path to: ${MAYA_LOCATION}/Maya.app/Contents/Frameworks") …Run Code Online (Sandbox Code Playgroud) 在我的 CMake 项目中,我构建了一堆在运行时作为插件加载的库。因此,我需要设置各种 RPATH,以便动态加载机制可以找到这些库。我还需要整个东西都是可重定位的,因为它是 Python 扩展模块的一部分,因此在构建过程中会被各种工具复制。
似乎正确的方法是使用$ORIGINLinux 上的特殊变量以相对方式设置 RPATH ,并且@loader_pathOSX。好吧,那很好。但是翻看
https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling
似乎我必须手动执行此操作?CMake 没有任何内置变量,如${ORIGIN}或根据操作系统扩展为正确事物的东西?(也许它甚至因链接器或其他东西而异?我不知道)。似乎这是 CMake 应该为我解决的事情,所以我想在尝试自己实现切换之前检查我没有遗漏任何东西......
顺便说一句,我不关心 Windows,所以如果有一些解决方案不适用于 Windows,这并不重要:)。
rpath ×10
macos ×5
cmake ×3
linux ×3
openssl ×2
c ×1
c++ ×1
delphi ×1
deployment ×1
dyld ×1
dylib ×1
frameworks ×1
hyperlink ×1
ld ×1
ldd ×1
library-path ×1
mach-o ×1
makefile ×1
openkinect ×1
path ×1
pkg-config ×1
stan ×1
suid ×1