如果您想了解动态链接,这个问题可能会很有趣。
该问题的一个答案提供了一个创建和使用动态库的绝妙示例。在此基础上,我做了一些简单的文件:
主.c:
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: 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
到目前为止,一切都很好。如果我 make 然后在命令提示符下输入 ./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 执行时没有错误,但在运行时显示“找不到库”。
gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main