创建一个简单的共享库

时间:2010-11-14 15:28:07

标签: c gcc shared-libraries

我正在尝试使用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

有谁能帮助我找出我在这里做错了什么?

3 个答案:

答案 0 :(得分:6)

尝试使用-L选项,该选项用于将目录添加到搜索-l选项的目录列表中:

cc client.c -L. -o client -lmytest

假设.soclient.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,看看它是否链接。