static

gcc提供了一个-static参数,可以改变gcc默认的连接方式
指定了这个-static选项,gcc在连接时对项目所有的依赖库都尝试去搜索名为lib.a的静态库文件,完成静态连接,如果找不到就报错了。这里指的所有是不仅指我们常用的第三方库比如jpeg,png,opencv,zlib,…,还包括gcc编译器自带的库libgcc,libstdc++,libc,libm…,总之就是linux kernal之外的所有库。而且还要包括所有被间接引用的第三方库,比如png这个库在编译时还用到了zlib,那么静态连接png的时候,就要带上zlib的库:-lpng -lz,

如何有选择的进行静态编译呢?
最简单的方式直接在连接参数中以全路径指定连接库就好了: your/path/lib.a
但这种形式对管理结构简单而且自己写Makefile的小型项目还好,当一个项目结构复杂,有时需要静态连接有时需要动态连接,这种频繁的修改编译脚本的方式,可维护性就太差了。
-Bstatic
gnu的连接程序ld提供了一个-Bstatic选项用于对指定的库静态连接,
大意就是-Bstatic参数指定对跟在它后面的所有库执行静态连接,如下就指定LDFLAGS对png这个库静态连接,ld会自动去搜索libpng.a
-Bstatic -lpng -lz
-l:filename
-l:filename格式指定一个文件名,连接程序直接去找这个文件名了,不会再像使用-lname时将name扩展成lib.a格式的文件名.
所以使用 -l:libpng.a这样的形式来指定连接库,就指定了静态连接png库。
当然如果库的位置不在gcc默认搜索路径中,要用-L参数另外指定搜索库的路径,否则连接程序不知道该从哪里找到filename。
-L/your/library/path -l:libmylib.a
当gcc -static 用于编译一个程序时,会使此程序静态编译(把动态库的函数和所依赖的任何的东西,都编译进本程序),编译好后,文件会非常大,但是,运行时就不需要依赖任何动态库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值