您的位置:首页 > 其它

[转]GCC中同时使用动态和静态库链接的参数解释

2017-02-19 09:14 363 查看
在我们开发的一个系统中,由于动态链接其中的一个动态库时,编译时没有问题,而运行时不能进行,如果将该库静态连接时,运行却没有问题。具体什么原因,一直没有搞清楚,权且当作暂时的解决办法。 
如何同时同时使用动态和静态库链接,同事周楠提供了一个参数的用法,在GCC指令参数中具体参数如下:
    -Wl,-Bstatic -L/usr/local/sqlite-arm-linux/.libs -lsqlite -Wl,-Bdynamic -L/usr/local/arm/3.3.2/lib
 具体用途解释:sqlite库静态连接,其它库动态连接。
-Wl,-Bstatic 与-Wl,-Bdynamic参数,从字面意义上可以理解,有静态和动态的意思,但是具体的真正规则在查找了GCC的原版手册上有说明。
 
原文:
Note - if the linker is being invoked indirectly, via a compiler driver (eg gcc) then all the linker command line options should be prefixed by -Wl,(or whatever is appropriate for the particular compiler driver) like this: gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link. 实际上主要针对隐式应用LINKER的参数,用“-Wl,”来标识,,“--startgroup foo.o bar.o -Wl,--endgroup”表示一组,,-Bstatic -Bdynamic 作为关键字与-WL,不可分,在GCC连接库时,默认链接是动态链接,现在用上面的指令限制在链接sqlite库时采用静态链接。 -Bstatic 还有三个写法:
-dn
-non_shared
-static -Bdynamic 还有两个写法:
-dy
-call_shared
上面参数“-L/usr/local/sqlite-arm-linux/.libs ”放不放在-Wl,...之间无所谓,因为它只是提供了sqlite动静态库的位置。可以改成下面的参数形式,更直观。 -L/usr/local/sqlite-arm-linux/.libs -L/usr/local/arm/3.3.2/lib -Wl,-dn -lsqlite -Wl,-dy   -Wl,-dn 和 -Wl,-dy成对出现才能起到标题所说的作用。   关于-Wl,后面的参数还有很多,全部明白我也不能。 还有一个问题值得注意,在-Wl,后面不能有空格,否则会出错!   关于-Wl,option 说明还有一段说明: GCC命令参数的英文原文 -Wl,option Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. 传递参数option作为linker的一个参数,如果option包含逗号,将在逗号处分割成几个参数。   例如: -Wl,-dn –lsqlite -dn 开始静态链接 -lsqlite 静态链接sqlite库 静态链接完后,然后需要动态链接 -Wl,-dy 重新开始动态链接。 原文转自:http://blog.sina.com.cn/s/blog_4cb133e5010009zx.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: