我是C编程的新手。我对.so文件一无所知。有什么需要呢?我怎么创建它?如何绑定我的C代码或二进制文件?如果我不制作任何.so文件并直接生成C代码的可执行二进制文件,它的PROS和CONS是什么?需要详细说明。
答案 0 :(得分:5)
.so
个文件是共享对象。通常,共享库为.so
。
通过使库.so
u实现内存使用效率。即当使用该库的多个应用程序正在运行时,该库仅加载到内存中一次,而不是静态库的情况。
创建动态库:
gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o
-fPIC
:编译器指令,用于输出与位置无关的代码,这是共享库所需的特性。
-shared
:生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件。
您可以找到更多信息here。
答案 1 :(得分:1)
.so
代表共享对象。在Windows世界中,这称为DLL。
您可以像使用DLL一样使用它 - 您可以动态地将应用程序链接到它。
如果您的库名为libblah.so,您可以使用gcc链接到它:
gcc myprog.c -lblah -o myprog
共享库有助于将常用功能分解为单独的文件。
但是,使用共享库可能会导致称为DLL Hell的现象。虽然这个问题起源于Windows世界,但它也适用于Linux系统,除非您非常关注所使用的共享库的确切版本并强制执行严格的版本控制。例如,通常情况下,如果使用共享库(甚至是系统共享库,而不是您创建的库)编译应用程序,然后尝试在另一个Linux机器上运行相同的可执行文件(具有截然不同的Linux版本或发行版) ),它可能无法运行 - 因为使用的共享库不一样。
因此,如果您希望可执行文件可以移植到最大数量的Linux系统而无需重新编译,那么静态编译它可能是有意义的。虽然这会使您的可执行文件更大,但它确实减少了通常归因于DLL Hell的问题。
答案 2 :(得分:0)
除了其他答案之外,请注意,要构建共享对象(或共享库),您最好以position independent code模式编译相关的源文件,如
gcc -Wall -O -fPIC src.c -c -o src.pic.o
在编译某些源代码时,使用-Wall
请求所有警告始终是有用的。
然后您可以使用
将所有这些*.pic.o
文件链接到.so
gcc -shared src1.pic.o src2.pic.o -o shared.so
您甚至可以使用
将一些共享库libfoo.so
链接到该共享对象中
gcc -shared src1.pic.o src2.pic.o -lfoo -o shared.so
最后可以使用dlopen将共享对象动态加载到进程中;这对获得plugins非常有用。 (然后为它们定义约定并使用dlsym
)
另请参阅program library howto和Executable & Link Format& shared library wikipages
制作共享库时,最好将其命名为lib
foo .so
,其中 foo 是一些任意名称。然后,在链接时,还使用-L
gcc
选项(实际上是链接器)来告诉包含它的目录,并使用-l
foo链接它选项。例如,在创建库时为您的库libnewbie.so
命名,并在链接-L.
之前传递-lnewbie
(如果它在当前目录中),例如gcc -Wall myprog.c -L. -lnewbie -o myprog