Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建简单的共享库_C_Gcc_Shared Libraries - Fatal编程技术网

C 创建简单的共享库

C 创建简单的共享库,c,gcc,shared-libraries,C,Gcc,Shared Libraries,我正在尝试使用GCC学习linux上的共享库概念。所以我创建了一个简单的库 图书馆c 这是使用 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。现在,我正在编写一个客户端来使用同一目录中的这个库 客户c 但这是一条信息 /usr/bin/ld: cannot find -l

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

图书馆c

这是使用

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
。现在,我正在编写一个客户端来使用同一目录中的这个库

客户c

但这是一条信息

/usr/bin/ld: cannot find -lmytest
collect2: ld returned 1 exit status

有人能帮我找出我做错了什么吗?

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

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

您缺少-Ldir选项

从GCC手册页:

如果尝试运行可执行文件,还需要指定共享库的位置,否则将找不到该库。这可以通过以下方式实现:

LD_库_路径=/客户机

编辑:


谢谢,但是运气不好。还是一样 错误。我甚至试过用它 完整的路径,但不起作用


我认为链接器需要库具有.so扩展。请尝试
ln-s libmytest.so.1.0.1 libmytest.so
并查看它是否链接。

谢谢,但运气不好。还是一样的错误。我甚至尝试过指定完整路径,但没有成功。我通过直接提供库名而不是通过-l来实现。请问您为什么要使用
-soname,libmytest.so.1
?@codaddict:我猜是cargo cult coding。@codaddict:我发现其中一个教程说“-soname,libmytest.so.1”。正确的方法是什么?作为每次运行可执行文件时设置
LD\u LIBRARY\u PATH
的替代方法,您可以在链接可执行文件时设置
LD\u run\u PATH
,这将在可执行文件中嵌入共享库的附加搜索路径。
cc client.c -L. -o client -lmytest
ln -s libmytest.so.1.0.1 libmytest.so   
cc client.c ./libmytest.so.1.0.1 -o client 
-Ldir  Add directory dir to the list of directories to be searched for -l.