例如:
现有两个文件:test.c、so_test.h;test.c里面定义了一个公共函数str_cpy()
我们将这两个文件编译成一个动态库:libtest.so。
命令:
$ gcc test.c -fPIC -shared -o libtest.so
有个程序源文件 main.c, 想调用str_cpy()函数.
编译时需要将main.c与动态库 libtest.so 链接生成执行文件main:
命令:$ gcc main.c -L. -ltest -o main
so文件不可以直接运行的,so文件是动态函数库文件,函数库文件(包括.a文件和.so文件)只能用来被调用运行,不能直接运行的,so文件就相当于Windows下的dll文件,dll文件就是不能直接运行的。.so是二进制格式的链接库文件,包含链接库源文件(.c)中的各函数实现、调试信息等。.out一般也是由gcc编译生成的二进制格式文件,但有可能是执行程序也可能是链接库文件,因为在linux中扩展名除了一些特殊的约定,一般情况下是无意义的。
执行文件也分动态链接还是静态链接。大多数情况都是动态链接,里面存放源文件(.c)中编译后的二进制代码及所调用函数库的入口参数,静态链接则是all-in-one,就是将所用到的非标准库都打包到执行文件中,所以体积都较大。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)