关于编译的几点须知

无论是C的编译还是C++编译,以及Perl或者Java的编译都可以通过make来完成。

 

1,在make的过程中,我们一般使用GNU的方式,来生成.so(动态库)、.a(静态库)或jar(java包)的文件,而在make install的过程中,安装的.so或者.a文件则比在make的时候生成的文件小很多。

2,在一些老版本的Linux机器当中,如果当make的时候出现:

... relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object;recompile with -fPIC

/usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../lib64/libxxxxxx.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

这时候,检查老版本的静态库gcc/g++是否使用过-fPIC进行过编译,一般x86_64平台都需要这个参数,而i386平台对这个参数不是很敏感;另外,如果没有静态库,则检查动态库是否连接正确,有的动态库是.so.xxx.0.0.0结尾,而不是以.so结尾,所以需要人工做一个软连接:

ln -sf libxxxxxx.so.xxx.0.0.0 libxxxxxx.so

3,32位机器上编译的包不能直接在64位机器上编译,如果需要进行编译,需要对gcc/g++设定一个参数-m32,保证gcc/g++在64位机器上编译出32位平台的包,但是值得注意的是,在任何情况下,不能将32位的库和64位的库来进行混合编译。

 

Categories

,
| | 评论(0)

发表评论

August 2012

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

关于此日记

此日记由 Cnangel 发表于 March 14, 2009 12:47 AM

此Blog上的上一篇日记rpm的一点学问

此Blog上的下一篇日记奇怪的JNI的问题

首页归档页可以看到最新的日记和所有日记。

归档

Powered by Movable Type 5.14-en