编译后的 libgmp 在其自己的前缀路径中作为依赖项

问题描述 投票:0回答:1

我已经成功地为 MacOS、arm64 和 x86_64 编译了一个 GMP 胖库。但是,如果我正确获得“otool -L”的输出,则该库将其自己的安装路径列为其依赖项(附加信息:libgmp 在 /usr/local/lib/ 中不存在):

~/projectDir/justATest$ otool -L ../lib_mac/libgmp.10.dylib 
../lib_mac/libgmp.10.dylib:
    /usr/local/lib/libgmp.10.dylib (compatibility version 16.0.0, current version 16.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)

我可以使用此库编译和链接最小的测试应用程序,但是当我启动应用程序时,该库预计位于 /usr/local/lib 中:

~/projectDir/justATest/build$ ./example 
dyld: Library not loaded: /usr/local/lib/libgmp.10.dylib
  Referenced from: /Users/geom/projectDir/justATest/build/./example
  Reason: image not found
Abort trap: 6

~/projectDir/justATest/build$ otool -L example 
example:
    /usr/local/lib/libgmp.10.dylib (compatibility version 16.0.0, current version 16.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 905.6.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)
geom@hexmac:~/projectDir/justATest/build$ 

这是意外的,因为 CMake 找到了我的 libgmp.10.dylib 并使用它进行编译。这个最小示例使用的 CMakeLists 是

cmake_minimum_required(VERSION 3.5)
project(testing)
set(CMAKE_MACOSX_RPATH 1)

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../lib_mac/)
add_executable(example main.cpp )

MESSAGE(${CMAKE_CURRENT_SOURCE_DIR}/../lib_mac/)
TARGET_LINK_LIBRARIES(example gmp.10 )

我不确定上面的 RPath 设置是否正确,但使用经典的 Makefile 和 rpath 我得到了相同的行为。因此我相信原因实际上是我编译的 libgmp.10.dylib 中的这条路径。为了测试 libgmp 编译,我解压了一个新的 gmp-6.3.0 目录,并使用这些行仅创建 x86_64 二进制文件:

export CFLAGS=" -O2 -fno-stack-check --target=x86_64-apple-darwin13.0.0"
./configure --enable-fat --build=x86_64-apple-darwin --host=x86_64-apple-darwin13.0.0
make -j 4

但行为相同。

geom@hexmac:~/gmpTest/gmp-6.3.0$ otool -L .libs/libgmp.10.dylib 
.libs/libgmp.10.dylib:
    /usr/local/lib/libgmp.10.dylib (compatibility version 16.0.0, current version 16.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)

我想知道库中的这条路径是否有问题,或者我的 rpath 使用是否错误?任何提示表示赞赏。

macos gmp dylib rpath
1个回答
0
投票

您在

otool -L
中看到的几乎肯定是
LC_ID_DYLIB
,而不是
LC_LOAD_DYLIB
(检查
otool -l
进行确认)。所以这一切都很好。

相反,您看到的问题来自于您的库的安装名称无法找到。如果您想使用 rpath,则库的安装名称需要类似于

@rpath/libgmp.10.dylib
@rpath/lib/libgmp.10.dylib
,具体取决于您预期的文件夹结构。

因此,您可以通过将适当的链接器标志传递给

configure
:

来使用正确的安装名称构建它
LDFLAGS='-Wl,-install_name,@rpath/libgmp.10.dylib' 

或者您可以使用

手动修复它
install_name_tool -id @rpath/libgmp.10.dylib libgmp.10.dylib

在这种情况下,您必须随后手动重新签名,并且您可能必须解压然后再次使用

lipo
将其捆绑起来。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.