免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 20891 | 回复: 5

gcc -shared选项求教 [复制链接]

论坛徽章:
0
发表于 2011-08-25 14:08 |显示全部楼层
gcc -shared -o libJava.so Java.o ./libdemo.a
有谁能给我说一下shared选项的意思吗,或者给我一个手册链接也行,谢谢大家了
我现在只能理解这是通过Java.o和libdemo.a生成libJava.so库,但这几个文件彼此间的关系是什么(比如在调用时)。因为没有编过程,不太懂这里面的东西,发帖求教大家

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2011-08-25 21:49 |显示全部楼层
好像是做动态库。你可以man一下的。

论坛徽章:
0
发表于 2011-08-26 15:05 |显示全部楼层
下载了一个gcc手册,和网上查到的一致,看来要慢慢领会了
-shared
Produce a shared object which can then be linked with other objects to form
an executable. Not all systems support this option.
(产生一个可以被其他obj链接生成可执行文件的共享obj。并非所有的系统都支持此选项)
For predictable results,
you must also specify the same set of options that were used to generate code
(‘-fpic’, ‘-fPIC’, or model suboptions) when you specify this option.1

论坛徽章:
0
发表于 2011-08-27 01:08 |显示全部楼层
回复 1# ForCalm

学习GCC的参数,可以建议LZ这样做.
把参数先全去掉,从最简单的一步步开始,按照GCC的友好提示来弄:
比如:
#. step 1
  1. gcc Java.o
复制代码
缺省是生成a.out可执行文件的
(顺便提一下Java.o应该是gcc -c Java.c生成的吧,这个LZ清楚了这里就不多说了)
一来会提示一些的符号找不到; 二者应该会找提示找不到"main"函数入口;
第一个问题需要其这的符号: 想必就是libdemo.a啦,".a"对应windows下是".lib"文件,也是".o"文件的集合啦,内部集合

好多函数的实现.
#. step 2
  1. gcc Java.o ./libdemo.a
复制代码
现在找不到符号的问题是不是没了,但是"main"符号找不到编译器(实质是ld链接器)开始喊啦.
因为你没有定义"main"函数噢,所以你可以把它生成是共享库(如果导演就是这样安排的).
#. step 3
  1. gcc Java.o ./libdemo.a -shared
复制代码
其实在我印象中,编译动态库,很少不用"fPIC"参数的,具体为啥man里也说了,用多了就自然啦,根据GCC的人性化

提示,最好是这样.
#. step 3.1
  1. gcc Java.o ./libdemo.a -shared -fPIC
复制代码
黄天不复苦心人,此时正常情况下,GCC不会再刁难你啦(它不说话)就说明OK啦. ls 一下是不是有个"a.out"文件啦.
噢,文件名不帅噢,改个个性化的名字吧:
#. step 4
  1. gcc Java.o ./libdemo.a -shared -fPIC -o libJava.so
复制代码
  1. gcc -c Java.c ./libdemo.a -shared -fPIC -o libJava.so
复制代码
因为GCC的顺序是不限制的,因个人习好而定,这个排版和LZ的应该是一样的,经过如此演义过程,每个参数的意义

LZ应该有点感觉了吧
但是有个原则,按组摆放一块:
比如:
  1. gcc \
  2.    -o libJava.so       \ #. 显示指定目标文件名. 否则就是a.out啦.
  3.    -shared -fPIC     \ #. 编译共享库的参数(组定搭档). 否则就没有“main”报错喽.
  4.    a.o b.o c.o          \ #. 由原代码a.c b.c c.c编译出来的一堆东东集中在一块.
  5.    ./libdemo.a          \ #. 依赖其它的一些lib库.
  6.    -ldl -lpthread      \ #. 依赖的系统共享库 对应libdl.so, libpthread.so (这里是举个例了,当然你的程序可能不需要哈)
复制代码
这里也是至在抛砖引玉哈,希望对LZ有帮助哈.

论坛徽章:
0
发表于 2013-01-20 11:23 |显示全部楼层
有用,谢谢~

论坛徽章:
0
发表于 2013-09-09 13:57 |显示全部楼层
感谢 @bbxyard 的热心回复,-shared的选项已经小解了,抱歉这么晚回复,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP