gcc -shared -o libJava.so Java.o ./libdemo.a

来源:互联网 发布:hishop 上传商品数据 编辑:程序博客网 时间:2024/06/10 05:54
学习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 (这里是举个例了,当然你的程序可能不需要哈)
复制代码
0 0
原创粉丝点击