创建一个简单的共享库

3

我正在尝试使用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。现在我正在编写一个客户端,以便在同一目录中使用这个库。 < p > 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个回答

7
尝试使用-L选项,该选项用于将目录添加到搜索-l选项的目录列表中。
cc client.c -L. -o client -lmytest

假设client.c.so文件在同一目录下。如果不是,请添加适当的路径。
连接器看到-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 

谢谢,但没有运气。仍然是相同的错误。我甚至尝试了指定完整路径,但还是没用。 - Navaneeth K N
我通过直接提供库名称而不是通过-l选项将其成功运行。 - Navaneeth K N
1
请问您为什么要使用-soname,libmytest.so.1 - codaddict
@codaddict:我猜是货物崇拜式编码。 - R.. GitHub STOP HELPING ICE
@codaddict:我发现其中一个教程说“-soname,libmytest.so.1”。正确的做法是什么? - Navaneeth K N

2
你缺少-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 进行链接,看看是否可行。


1
作为在每次运行可执行文件时设置LD_LIBRARY_PATH的替代方案,您可以在链接时设置LD_RUN_PATH,这将在可执行文件中嵌入用于共享库的附加搜索路径。 - caf

1
链接器通常只在系统路径中搜索库。通过向gcc传递-L以指定要搜索的其他路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接