MacOS——如何使用gcc/ld将动态库与相对路径链接
如果您试图了解动态链接,则可能会感兴趣 这个问题的一个答案提供了一个创建和使用动态库的极好示例。在此基础上,我创建了一些简单的文件: 主要条款c:MacOS——如何使用gcc/ld将动态库与相对路径链接,macos,gcc,linker,ld,dynamic-library,Macos,Gcc,Linker,Ld,Dynamic Library,如果您试图了解动态链接,则可能会感兴趣 这个问题的一个答案提供了一个创建和使用动态库的极好示例。在此基础上,我创建了一些简单的文件: 主要条款c: extern void someFunction (int x); int main (int argc, char** argv ) { someFunction(666); } 我的图书馆c: #include <stdio.h> void someFunction (int x) { printf ("\nso
extern void someFunction (int x);
int main (int argc, char** argv ) {
someFunction(666);
}
我的图书馆c:
#include <stdio.h>
void someFunction (int x) {
printf ("\nsomeFunction called with x=%d\n", x);
}
到目前为止,一切都很顺利。如果在命令提示下生成并输入./main,则会看到预期的输出:
someFunction called with x=666
现在,我想把事情搞混一点。我已经创建了一个目录hidelib,它是我的主目录的一个子目录。我在makefile中添加了一行:
main: mylibrary.c main.c
gcc -c mylibrary.c
gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
gcc -c main.c
mv libmylibrary.dylib hidelib # this is the new line
clean:
rm *.o
rm main
rm hidelib/*.*
现在,我想在makefile中添加另一行,以便在hidelib子目录中找到libmylibrary.dylib。我希望能够以相同的方式运行/main。我该怎么做
编辑:谢谢你的回复。有很多选择是很好的,但是初学者只想要一个具体可行的选择。这是我在最后一行中尝试的内容,但显然我不明白一些事情。makefile执行时没有错误,但在运行时会显示“未找到库”
您可能需要添加到库的搜索路径中的
-L
编译器/链接器标志
如果在链接后尝试移动对象,则需要一个dyld
环境变量来搜索位置mandyld
,您应该能够获得有关dyld\u LIBRARY\u PATH
和其他环境变量的更多信息
但是,通常,在链接到具有-install\u name
链接器标志的对象之前,将库的安装名称设置为@rpath/mylibrary.dylib
作为值,然后在编译时将主可执行文件上的运行路径搜索路径设置为-rpath
标记为@executable\u path/hidelib
gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib
有关更多信息,请参阅install\u name\u工具
和ld
的-rpath
和-install\u name
参数
基本上,您尝试执行的操作有很多选项。一个具体可行的选项是在链接
.dylib
时设置install\u name
标志
gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib
然后您可以正常链接到库:
gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main
gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main