windows下的dll即是动态链接库;Linux中叫共享库;
企业开发经常会把程序打包成一个库文件,进行整合和管理;
库分为:
静态库和共享库(又称动态库);
库是.o文件的打包;
"静态库"是代码的归档,在编译连接时会"复制"这段代码到目标文件中;
//优点是独立,连接完成后就不再需要静态库,而且速度会稍快;
//缺点是占用空间太大,修改和维护不方便;
"共享库"在编译连接时会把代码的"地址"放入目标文件中;
//优点是占用空间小,修改和维护方便;
//缺点是在程序运行时必须保证能找到共享库,速度稍慢;
企业开发中主流使用共享库(维护方便,占用空间小);
gcc的-static选项可以将系统库以静态的方式连接文件;
gcc -static 01hello.c -o b.out
使用静态库生成b.out;生成的文件会比较大;
如果gcc -static 01hello.c报错
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
请首先安装glibc-static;
由于在配置的过程中误删了libc.so导致编译无法进行
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
collect2: ld returned 1 exit status
然后拷贝了libc.so到/lib目录;/lib/libc.so的内容如下
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) )
结果还是无法编译;于是又执行yum install glibc*和yum reinstall glibc*
问题顺利解决;
以后再设置系统环境的时候一定要小心谨慎,先做好备份,然后不要轻易删除文件;
静态库的创建步骤:
1.编写源程序02add.c;
2.编译源程序,生成目标文件(.o);
gcc -c 02add.c
3.打包.o文件生成静态库文件.a;
ar -r 库文件名 所有的.o文件
静态库文件名的命名规范:以lib开头,以.a结尾,中间放库名;
ar -r libmylib.a 02add.o //本命令可以创建库文件;
静态库的使用步骤:
1.编写应用程序02test.c;
2.编译02test.c,生成目标文件(不连接);
gcc -c 02test.c
3.连接静态库文件和02test.o,有三种方法
3.1直接连接
gcc 02test.o libmyku.a //不是很专业
3.2双L连接法 重点
gcc -l库名 -L库所在的目录 02test.o
gcc 02test.o -lmylib -L.//位置可以换
3.3单L连接法 //配置环境变量LIBRARY_PATH
配置环境变量LIBRARY_PATH,
导出把库所在目录export LIBRARY_PATH=. //当前目录;
gcc 02test.o -lmylib
注意:编写企业代码,需要提供一个库文件和一个头文件;
共享库的创建步骤:
1.写源程序03add.c,保存退出;
2.编译生成目标文件.o;
gcc -c -fpic 03add.c
/* -fpic不写也是可以的,但不规范 */
3.生成共享库文件.so
gcc -shared 03add.o -o libmyku.so
//共享库的库文件名和静态库一样,有规范,区别就是以.so做后缀
//有些系统的共享库后缀是.so.整数;
共享库的使用步骤和静态库的使用步骤一样;
共享库不可以直接运行但可以参与运行;在运行时必须配置环境变量LD_LIBRARY_PATH;export LD_LIBRARY_PATH=. //配置运行时的环境变量;
ldd a.out命令可以查看相关的共享库文件
系统提供了一套API(应用程序编程接口,就是各种函数)可以直接打开共享库文件;
dlopen() 打开库文件
dlsym() 从打开的库文件中得到函数
dlclose() 关闭
dlerror() 判断是否出错
企业开发经常会把程序打包成一个库文件,进行整合和管理;
库分为:
静态库和共享库(又称动态库);
库是.o文件的打包;
"静态库"是代码的归档,在编译连接时会"复制"这段代码到目标文件中;
//优点是独立,连接完成后就不再需要静态库,而且速度会稍快;
//缺点是占用空间太大,修改和维护不方便;
"共享库"在编译连接时会把代码的"地址"放入目标文件中;
//优点是占用空间小,修改和维护方便;
//缺点是在程序运行时必须保证能找到共享库,速度稍慢;
企业开发中主流使用共享库(维护方便,占用空间小);
gcc的-static选项可以将系统库以静态的方式连接文件;
gcc -static 01hello.c -o b.out
使用静态库生成b.out;生成的文件会比较大;
如果gcc -static 01hello.c报错
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
请首先安装glibc-static;
由于在配置的过程中误删了libc.so导致编译无法进行
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
collect2: ld returned 1 exit status
然后拷贝了libc.so到/lib目录;/lib/libc.so的内容如下
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) )
结果还是无法编译;于是又执行yum install glibc*和yum reinstall glibc*
问题顺利解决;
以后再设置系统环境的时候一定要小心谨慎,先做好备份,然后不要轻易删除文件;
静态库的创建步骤:
1.编写源程序02add.c;
2.编译源程序,生成目标文件(.o);
gcc -c 02add.c
3.打包.o文件生成静态库文件.a;
ar -r 库文件名 所有的.o文件
静态库文件名的命名规范:以lib开头,以.a结尾,中间放库名;
ar -r libmylib.a 02add.o //本命令可以创建库文件;
静态库的使用步骤:
1.编写应用程序02test.c;
2.编译02test.c,生成目标文件(不连接);
gcc -c 02test.c
3.连接静态库文件和02test.o,有三种方法
3.1直接连接
gcc 02test.o libmyku.a //不是很专业
3.2双L连接法 重点
gcc -l库名 -L库所在的目录 02test.o
gcc 02test.o -lmylib -L.//位置可以换
3.3单L连接法 //配置环境变量LIBRARY_PATH
配置环境变量LIBRARY_PATH,
导出把库所在目录export LIBRARY_PATH=. //当前目录;
gcc 02test.o -lmylib
注意:编写企业代码,需要提供一个库文件和一个头文件;
共享库的创建步骤:
1.写源程序03add.c,保存退出;
2.编译生成目标文件.o;
gcc -c -fpic 03add.c
/* -fpic不写也是可以的,但不规范 */
3.生成共享库文件.so
gcc -shared 03add.o -o libmyku.so
//共享库的库文件名和静态库一样,有规范,区别就是以.so做后缀
//有些系统的共享库后缀是.so.整数;
共享库的使用步骤和静态库的使用步骤一样;
共享库不可以直接运行但可以参与运行;在运行时必须配置环境变量LD_LIBRARY_PATH;export LD_LIBRARY_PATH=. //配置运行时的环境变量;
ldd a.out命令可以查看相关的共享库文件
系统提供了一套API(应用程序编程接口,就是各种函数)可以直接打开共享库文件;
dlopen() 打开库文件
dlsym() 从打开的库文件中得到函数
dlclose() 关闭
dlerror() 判断是否出错