如果您尝试了解动态链接,this question可能会引起关注。
该问题的答案之一提供了创建和使用动态库的绝佳示例。基于它,我有一些简单的文件:
main.c中:
extern void someFunction (int x);
int main (int argc, char** argv ) {
someFunction(666);
}
mylibrary.c:
#include <stdio.h>
void someFunction (int x) {
printf ("\nsomeFunction called with x=%d\n", x);
}
生成文件:
main: mylibrary.c main.c
gcc -c mylibrary.c
gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
gcc -c main.c
gcc -v main.o ./libmylibrary.dylib -o main
clean:
rm *.o
rm main
rm *.dylib
到目前为止,一切都很好。如果我创建然后在命令提示符下输入./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执行时没有错误,但在运行时它表示&#34;库未找到。&#34; gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main
答案 0 :(得分:15)
一个可行的选项是在链接install_name
时设置.dylib
标记。
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
答案 1 :(得分:7)
您可能需要-L
编译器/链接器标志,该标志会添加到库的搜索路径中。
尝试在链接后移动内容时,您需要一个dyld
环境变量来搜索。 man dyld
您应该能够获得有关DYLD_LIBRARY_PATH
和其他环境变量的更多信息。
但是,通常情况下,在将-install_name
链接器标记链接到@rpath/mylibrary.dylib
之类的值之前,先设置库的安装名称,然后在主数据库上设置运行路径搜索路径在使用-rpath
标志进行编译时执行@executable_path/hidelib
。
有关详细信息,请参阅install_name_tool
和-rpath
&amp; -install_name
的{{1}}个参数。
基本上,你要做的事情有很多选择。