MacOS编译的libgmp依赖自身安装路径致程序运行失败求助
macOS下libgmp库路径依赖问题及解决方法
问题现象
已成功编译支持arm64和x86_64的libgmp胖库,但通过otool -L查看发现,库将自身的默认安装路径列为依赖项(/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)
测试用的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 )
开启了CMAKE_MACOSX_RPATH,且用传统Makefile加rpath也出现相同问题,因此判断问题根源在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)
问题根源
问题出在libgmp编译时生成的LC_ID_DYLIB(即库的"install name")被默认设置为/usr/local/lib/libgmp.10.dylib——这是configure默认的安装路径,但实际我们并未将库安装到该位置。无论是库自身的依赖记录,还是链接它的应用程序,都会沿用这个路径查找库文件,最终导致运行时找不到。
解决方法
方法1:编译gmp时指定install name
在configure阶段通过LDFLAGS设置链接器的-install_name选项,将库的install name设为@rpath开头的相对路径:
export CFLAGS=" -O2 -fno-stack-check --target=x86_64-apple-darwin13.0.0" export LDFLAGS="-install_name @rpath/libgmp.10.dylib" ./configure --enable-fat --build=x86_64-apple-darwin --host=x86_64-apple-darwin13.0.0 make -j 4
方法2:修改已编译好的库的install name
如果已经编译完库,可以用install_name_tool修改其install name:
install_name_tool -id @rpath/libgmp.10.dylib ../lib_mac/libgmp.10.dylib
配合CMake正确设置rpath
修改完库的install name后,在CMake中确保正确配置rpath,让应用程序知道去哪里找库:
cmake_minimum_required(VERSION 3.5) project(testing) set(CMAKE_MACOSX_RPATH 1) # 将库所在目录添加到程序的运行时搜索路径 set(CMAKE_INSTALL_RPATH "${CMAKE_CURRENT_SOURCE_DIR}/../lib_mac/") set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../lib_mac/) add_executable(example main.cpp ) TARGET_LINK_LIBRARIES(example gmp.10 )
这样配置后,编译出的测试应用会在运行时从指定的rpath目录中加载libgmp库,解决找不到的问题。
内容的提问来源于stack exchange,提问作者Geom
相关产品推荐
相关产品推荐

