Ⅰ linux下怎么 调用 和生成 静态库
Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 动态库和静态库的区别: 当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。 两种库的编译产生方法: 第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库: /* hello.c */ #include void sayhello() { printf("hello,world\n"); } 用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等
Ⅱ linux生成文件中.so 文件和.out文件的区别
.so是二进制格式的链接库文件,包含链接库源文件(.c)中的各函数实现、调试信息等。
.out一般也是由gcc编译生成的二回进制格式文件,但有可能是执行程序也可能是链接库文件,因为在linux中扩展名除了一些特殊的约定,一般情况下是无意义的。
执行文件也分动态链接还是静态链接。大多数情况都是动态链接,里面存放源文件(.c)中编译后的二进制代码及所调用函数库的入口参数,静态链接则是all-in-one,就是将所用到的非标准库都打包到执行文件中答,所以体积都较大。
Ⅲ linux 怎么编译.so文件
.so是linux用的 所以 要生成so 需要用gcc 和生成可执行文件类似,只是增加一些编译选项 命令如下内 gcc SOURCE_FILES -fPIC -shared -o TARGET SOURCE_FILES可以容是.c文件,也可以是经过-c编译出来的.o文件 TARGET为so文件。
Ⅳ linux中,a文件与.so文件有什么关系吗
.a和.so文件都是函数库文件。库是一组预先编译好的函数的集合,库文件的名字以内lib开头,随后的容部分指明这是什么库(例如c代表C语言库,m代表数学库)。
.a代表的是静态函数库,当同时运行多个程序并且都使用到同一个函数库的函数时,内存中就会有同一函数的多份副本,会消耗大量宝贵的内存。
.so是共享函数库,可以克服.a函数库的不足。当一个程序使用共享函数库时,程序本身不再包含函数代码,而只是引用共享代码,当实际调用时,共享库才被加载到内存中。
.a文件类似于Windows下的.lib文件,.so文件类似于Windows下面的.dll文件,这样就好理解了。
Ⅳ Linux下如何将多个.c文件生成.so文件
最好把头文件与so一起打包,当然你知道里面接口的定义的话头文件也不需要
linux版本专太多(redhat,属centos,ubuntu,solaris.....),各个版本之间有差异别的电脑相同版本的linux系统的话应该能用,如果系统不一样不行
Ⅵ linux中把.c的文件编译成.so
就跟用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
Ⅶ linux下如何查看.a.so文件是由什么文件编译连接
linux下如何查看.a.so文件是由什么文件编译连接
so文件就是通常说的动态链接库,就跟windows下的专dll文件属差不多。
ko是内核模块文件,驱动之类的啥的。
不过在linux系统下文件的后缀多数情况下只是个标识,有可能代表不了文件的真实属性的。
至于怎么编写,就跟用VS编译dll或者lib文件差不多,把你的代码编译完成以后命名为相应的后缀就好了。
我了解的一般都是C程序,java属于脚本语言,程序多数情况下是被解释执行的,所以一般不需要编译成库。至于如何编译成库文件,如果你在windows下做过开发的话应该不用我解释太多。实在不知道的话可以再问我哈~~
希望以上回答能对你有所帮助。
Ⅷ C++文件如何在linux下生成动态库So,以及如何使用这个动态库
用g++指定参数可以生成动态库,使用动态库的话就用dlopen() 和 dlsym()
Ⅸ linux使用libtool生成动态库名为.la,请问.so在什么地方
libc 和 lib-linux 这两个最基本的库都没有,请问其他电脑上跑的是linux吗?没有这两个库,没有一个程序可以运行。 另外,不可能把已有的动态库“直接”转换成静态库,你只能从源码编译出静态库。