linux生成文件中.so 文件和.out文件的区别

linux生成文件中.so 文件和.out文件的区别,第1张

.so是二进制格式的链接库文件,包含链接库源文件(.c)中的各函数实现、调试信息等。

.out一般也是由gcc编译生成的二进制格式文件,但有可能是执行程序也可能是链接库文件,因为在linux中扩展名除了一些特殊的约定,一般情况下是无意义的。

执行文件也分动态链接还是静态链接。大多数情况都是动态链接,里面存放源文件(.c)中编译后的二进制代码及所调用函数库的入口参数,静态链接则是all-in-one,就是将所用到的非标准库都打包到执行文件中,所以体积都较大。

就跟用VS编译dll或者lib文件差不多,把代码编译完成以后,命名为相应的后缀就好了。

例如:

gcc -c -fPIC libst.c

生成 libst.o

然后

gcc -shared -fPIC -o libst.so libst.o

生成 libst.so 动态链接库

把libst.so拷贝到系统默认库目录下,比如 /lib, /usr/lib 下

假定有 test.c 要引用这个库

gcc -lst -o test test.c

然后就可以了

假如不能把libst.so拷贝到默认库目录下,比方说放在了

/home/aaa/lib 下

那么就用这样的语句来编译test.c

gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c

so文件是动态库的集合,由f90文件编译而成,此时f90程序中一般不包含program开头的主程序,而只包含module,例如:

将f90源文件编译为动态库时,使用命令

此时将生成两个文件,分别为bisectmod.mod和lib***.so,这儿的***是刚才自定义的名字,而*.mod文件名则是f90文件中module的名字,是自动生成的,如果一个f90文件中包含N个module,则会生成N个*.mod和1个lib***.so。so文件作为库文件,也可以由多个f90文件共同编译得到,相当于静态库中的打包,将多个库打包到一个里,如下:

动态库的使用包含两部分,一是在编译时,二是在程序运行时。

编译包含动态库的主程序时,要同时制定mod文件的路径和so文件的路径,如果mod文件、so文件以及主程序文件在同一目录下,直接指定so文件即可:

但是当使用第三方库时,通常会分别存放在include和lib文件夹中,此时就要单独指定路径了:

第一个参数-I是大写的i,代表include,第二个l是小写的L,代表lib的名字,可以省略lib以及后面的.so,第三个-L则是lib.so文件的路径。

这样编译的结果不能运行,因为运行时程序找不到lib***.so文件,最好的办法是指定LD_LIBRARY_PATH环境变量,当然也可以将lib***.so文件复制到系统的lib文件夹中。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/6173383.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-17
下一篇2023-03-17

发表评论

登录后才能评论

评论列表(0条)

    保存