关于编译的几点须知

无论是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位的库来进行混合编译。

 

Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Entry

This page contains a single entry by Cnangel published on March 14, 2009 12:47 AM.

rpm的一点学问 was the previous entry in this blog.

奇怪的JNI的问题 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.