我正在尝试使用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
有谁能帮助我找出我在这里做错了什么?
答案 0 :(得分:6)
尝试使用-L
选项,该选项用于将目录添加到搜索-l
选项的目录列表中:
cc client.c -L. -o client -lmytest
假设.so
与client.c
位于同一目录中。如果没有添加合适的路径。
看到-lmytest
的链接器会查找libmytest.so
,但您附加了一个版本号,因此它不起作用。解决此问题的方法是创建一个名为libmytest.so
的符号链接,指向libmytest.so.1.0.1
ln -s libmytest.so.1.0.1 libmytest.so
或者,您可以在编译/链接行上使用完整的库名称:
cc client.c ./libmytest.so.1.0.1 -o client
答案 1 :(得分:1)
链接器通常只搜索系统路径中的库。将-L
传递给gcc
,以指定要搜索的其他路径。
答案 2 :(得分:1)
您缺少-Ldir选项。
来自GCC手册页:
-Ldir Add directory dir to the list of directories to be searched for -l.
如果尝试运行可执行文件,还需要指定共享库所在的位置,否则将无法找到库。这可以通过以下方式完成:
LD_LIBRARY_PATH=. ./client
编辑:
谢谢,但没有运气。还是一样 错误。我甚至尝试过指定 完整的道路,但没有奏效。
我认为链接器需要库具有.so扩展名。试试ln -s libmytest.so.1.0.1 libmytest.so
,看看它是否链接。