您的位置:首页 > 编程语言 > Java开发

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

2015-10-10 14:06 218 查看
学习GCC的参数,可以建议LZ这样做.

把参数先全去掉,从最简单的一步步开始,按照GCC的友好提示来弄:

比如:

#. step 1

gcc Java.o

复制代码
缺省是生成a.out可执行文件的

(顺便提一下Java.o应该是gcc -c Java.c生成的吧,这个LZ清楚了这里就不多说了)

一来会提示一些的符号找不到; 二者应该会找提示找不到"main"函数入口;

第一个问题需要其这的符号: 想必就是libdemo.a啦,".a"对应windows下是".lib"文件,也是".o"文件的集合啦,内部集合

好多函数的实现.

#. step 2

gcc Java.o ./libdemo.a

复制代码
现在找不到符号的问题是不是没了,但是"main"符号找不到编译器(实质是ld链接器)开始喊啦.

因为你没有定义"main"函数噢,所以你可以把它生成是共享库(如果导演就是这样安排的

).

#. step 3

gcc Java.o ./libdemo.a -shared

复制代码
其实在我印象中,编译动态库,很少不用"fPIC"参数的,具体为啥man里也说了,用多了就自然啦,根据GCC的人性化

提示,最好是这样.

#. step 3.1

gcc Java.o ./libdemo.a -shared -fPIC

复制代码
黄天不复苦心人,此时正常情况下,GCC不会再刁难你啦(它不说话)就说明OK啦. ls 一下是不是有个"a.out"文件啦.

噢,文件名不帅噢,改个个性化的名字吧:

#. step 4

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

复制代码

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

复制代码
因为GCC的顺序是不限制的,因个人习好而定,这个排版和LZ的应该是一样的,经过如此演义过程,每个参数的意义

LZ应该有点感觉了吧

但是有个原则,按组摆放一块:

比如:

gcc \

-o libJava.so \ #. 显示指定目标文件名. 否则就是a.out啦.

-shared -fPIC \ #. 编译共享库的参数(组定搭档). 否则就没有“main”报错喽.

a.o b.o c.o \ #. 由原代码a.c b.c c.c编译出来的一堆东东集中在一块.

./libdemo.a \ #. 依赖其它的一些lib库.

-ldl -lpthread \ #. 依赖的系统共享库 对应libdl.so, libpthread.so (这里是举个例了,当然你的程序可能不需要哈)

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: