创建一个简单的共享库

标签 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

谁能帮我找出我做错了什么?

最佳答案

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

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

假设 .soclient.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/

相关文章:

c - Powerpc arch 上的 gcc 内联汇编程序隐式函数声明

c++ - 无法使用 GDB 进入共享库中的函数

c++ - 全局字符串在共享库中取消设置

c - C连接值重新分配中的TCP/IP

c - 从文件中读取代码

c - 使用 dlopen() 加载时解决动态库依赖关系

c - Linux 的 Windows 子系统上的 CTRL+D 问题

c - 从文件中读取 MKL_INT 时的特殊行为

c++ - gcc 版本之间的舍入差异

使用预构建的静态库进行编译