我正在尝试使用 GCC 学习 Linux 上的共享库概念。所以我创建了一个简单的库。
library.c
int foo(void) {
return 10;
}
这是使用编译的,
cc -fPIC -g -c library.c
cc -shared -fPIC -Wl,-soname,libmytest.so.1 -o libmytest.so.1.0.1 library.o -lc
它在当前目录中创建了文件 libmytest.so.1.0.1
。现在我正在编写一个客户端来使用同一目录中的这个库。
client.c
#include <stdio.h>
extern int foo(void);
int main()
{
int a = foo();
printf("a is %d", a);
return 0;
}
编译使用,
cc client.c -o client -lmytest
但这会随着消息退出
/usr/bin/ld: cannot find -lmytest
collect2: ld returned 1 exit status
谁能帮我找出我做错了什么?
最佳答案
尝试使用 -L
选项,该选项用于将目录添加到搜索 -l
选项的目录列表中:
cc client.c -L. -o client -lmytest
假设 .so
与 client.c
存在于同一目录中。如果没有添加合适的路径。
看到 -lmytest
的链接器寻找 libmytest.so
但是你有一个版本号附加到它所以它不起作用。解决此问题的方法是创建一个名为 libmytest.so
的符号链接(symbolic link),指向 libmytest.so.1.0.1
ln -s libmytest.so.1.0.1 libmytest.so
或者,您可以在编译/链接行中使用完整的库名称:
cc client.c ./libmytest.so.1.0.1 -o client
关于创建一个简单的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178138/