[编译]GCC - 部分动态链接部分静态链接

头像
C艹艹
崭露头角
崭露头角
帖子: 26
注册时间: 2016年09月23日 11:32
拥有现金: 锁定
Has thanked: 4 times
Been thanked: 8 times
联系:

[编译]GCC - 部分动态链接部分静态链接

帖子 #1 C艹艹 » 2016年11月04日 14:49

转自:http://blog.zheezes.com/senior-gcc-compiler-link-parameters.html

一.前言

用过gcc的人很多,但称得上精通的人可能真不多,下面的gcc高级参数,你又知道多少呢?

二.部分动态链接部分静态链接

说到gcc静态链接,感觉大家都知道的吗,-static,但如果要说是,部分库静态链接,部分库又要动态链接,大家感觉就晕了。

为什么有这种需求呢?因为有些库,如oracle客户端库,是不能完全静态链接的,但为了方便,又希望把部分库做静态链接,如libev,结果是需要静态链接libev,然后动态链接oracle客户端库。

gcc提供了面对这种极端情况的方法:-Wl,option,注意中间不能有空格

用于灵活的配置动态链接和静态链接

下面的例子,静态链接libev,然后动态链接oracle math等库

-Wl,-static -lev -Wl,-call_shared -lnsl -lclntsh -lnnz11 -lm

注意,这个参数是Linker Options,链接时生效

三.设置动态链接PATH

一般来说,大量服务器部署的时候,服务器的PATH等应该是一样的,但如果某些服务器没有完全标准化配置,比如oracle的安装路径修改了,部分服务器,程序放上去找不到oracle客户端的lib,你是不是要抓狂了呢?

面对这种问题,一般都是增加一个初始化的脚本设置PATH或者修改profile文件,无形中又引入了新的需求。

gcc提供了一个参数:-Wl,-rpath,注意中间不能有空格

用于在链接程序的时候增加PATH的搜索路径,这样就避免了需要脚本来初始化PATH的麻烦,遇到新的环境,增加rpath就好了,方便统一的部署。

下面的例子,设置了两个oracle lib动态链接的路径:

-Wl,-rpath=/home/oracle/db_1/lib -Wl,-rpath=/home/app/oracle

也可以简写,注意是”:”,和PATH的路径分隔符一样,还要注意中英文字符:

-Wl,-rpath=/home/oracle/db_1/lib:/home/app/oracle

回到 “编译、链接与标准库”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客