我做了这些步骤并创建了共享库。 但在这里我有一些问题
我想知道为什么要写4步和5步。
我只知道这些步骤用于链接库
第六步为什么我们只使用lhuffman insted libhuffman
步骤进行:
1 gcc -c -fPIC filebits.c -o filebits.o
2 gcc -shared -Wl,-soname,libhuff.so.1 -o libhuffman.so.1.0.1 filebits.o
3 mv libhuffman.so.1.0.1 /home/mydesktop/slib/
4 ln -sf /home/mydesktop/slib/libhuffman.so.1.0.1 /home/mydesktop/slib/libhuffman.so
5 ln -sf /home/mydesktop/slib/libhuffman.so.1.0.1 /home/mydesktop/slib/libhuffman.so.1
6 gcc -o app app.c -lhuffman
7 ./app
请向我解释这些步骤
答案 0 :(得分:3)
构建库时,链接器选项错误:
-Wl,-soname,libhuff.so.1
应该是
-Wl,-soname,libhuffman.so.1
来自fine manual:
-soname
= 名称
[...]运行可执行文件时,动态链接器将尝试加载由DT_SONAME字段指定的共享对象,而不是使用为链接器指定的文件名。
答案 1 :(得分:1)
1. i want know why we write 4 and 5 steps.
在步骤4中,您将创建一个指向库名称的软链接,链接器将查找该链接以进行链接
在步骤5中,您将创建指向库的软链接,指示其主要版本。您无需按照这些步骤进行操作,而是可以在第一步中生成libhuffman.so
作为链接器查找的输出。但是遵循这个惯例,以便图书馆的主要&轻微跟踪次要版本。通常,库的名称为library_name.MAJOR_VERSION.MINOR_VERSION
。 library_name.MAJOR_VERSION
&的形式有软链接。只有library_name
的另一个软链接。 library_name
的形式为 lib [library_name]。 so ,因为这是链接器在使用-l
选项时所期望的格式。您可以在Linux PC上检查库,在很多情况下您会看到遵循此约定。这个link提供了一些有关此问题的详细信息。
2.in 6th step why we use only lhuffman insted of libhuffman
GCC linker adds lib & .a (or .so) to the library name which is specified with -l
option.
希望这有帮助!