创建一个简单的共享库

Nav*_*K N 3 c gcc shared-libraries

我正在尝试使用GCC在linux上学习共享库概念.所以我创建了一个简单的库.

LIBRARY.C

int foo(void)  {
    return 10;
}
Run Code Online (Sandbox Code Playgroud)

这是使用编译的,

cc -fPIC -g -c library.c
cc -shared -fPIC -Wl,-soname,libmytest.so.1 -o libmytest.so.1.0.1 library.o -lc
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

编译使用,

cc client.c -o client -lmytest
Run Code Online (Sandbox Code Playgroud)

但这会随着消息退出

/usr/bin/ld: cannot find -lmytest
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

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

cod*_*ict 6

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

cc client.c -L. -o client -lmytest
Run Code Online (Sandbox Code Playgroud)

假设.so它存在于同一目录中client.c.如果没有添加合适的路径.

看到的链接器-lmytest查找libmytest.so但是您附加了一个版本号,因此它不起作用.修复此问题的方法是创建一个名为libmytest.so指向的符号链接libmytest.so.1.0.1

ln -s libmytest.so.1.0.1 libmytest.so   
Run Code Online (Sandbox Code Playgroud)

或者,您可以在编译/链接行上使用完整的库名称:

cc client.c ./libmytest.so.1.0.1 -o client 
Run Code Online (Sandbox Code Playgroud)