Mac下C语言编译后可执行文件无法找到外部库的问题
Mac下C语言动态库运行时找不到的解决方法
核心问题:Mac与Linux的动态库加载机制不同
你用的LD_LIBRARY_PATH是Linux系统的环境变量,Mac的动态加载器dyld不识别这个,需要用DYLD_LIBRARY_PATH替代。
临时解决:设置正确的环境变量
在终端执行以下命令(替换为你的库所在绝对路径):
export DYLD_LIBRARY_PATH=/你的库绝对路径:$DYLD_LIBRARY_PATH
之后再运行./hello.out即可找到库。如果想永久生效,把这条命令添加到~/.zshrc或~/.bash_profile中(根据你使用的shell选择)。
永久解决:编译时添加rpath参数
不想每次都手动设置环境变量的话,在Makefile的链接阶段加入-Wl,-rpath,/你的库绝对路径参数。比如原链接命令:
gcc hello.o -L/path/to/lib -lmurmurhash -o hello.out
修改为:
gcc hello.o -L/path/to/lib -lmurmurhash -Wl,-rpath,/path/to/lib -o hello.out
这样编译出的hello.out会把指定的库路径写入自身的rpath中,运行时会自动去该路径查找库,无需依赖环境变量。
额外提示:遵循Mac动态库规范后缀
Mac标准动态库后缀是.dylib而非.so,你可以将已编译的libmurmurhash.so重命名为libmurmurhash.dylib,或者编译库时直接指定输出后缀:
gcc -shared -fPIC murmurhash.c -o libmurmurhash.dylib
这样更贴合Mac生态,减少潜在兼容问题。
内容的提问来源于stack exchange,提问作者dasman
相关产品推荐
相关产品推荐

