Whilst compiling fann/pyfann on a 64-bit Ubuntu machine, I got that annoying -fPIC compilation error:
../src/include/fann_internal.h:73: warning: function declaration isnat a prototype
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.6/pyfann/pyfann_wrap.o build/temp.linux-x86_64-2.6/pyfann/fann_helper.o ../src/doublefann.o -o build/lib.linux-x86_64-2.6/pyfann/_libfann.so
/usr/bin/ld: ../src/doublefann.o: relocation R_X86_64_32 against `.rodata.str1.1′ can not be used when making a shared object; recompile with -fPIC
../src/doublefann.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
error: command ‘gcc’ failed with exit status 1
I did some googling and promptly found this Gentoo guide for resolving -fPIC errors,
http://www.gentoo.org/proj/en/base/amd64/howtos/index.xml?part=1&chap=3
The case that ended up being relevant was:
3.f. Case 3: Lack of `-fPIC’ flag in the software to be built
This is the most common case. It is a real bug in the build system and should be fixed in the ebuild, preferably with a patch that is sent upstream. Assuming the error message looks like this:
Code Listing 6.1: A sample error message |
.libs/assert.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC .libs/assert.o: could not read symbols: Bad value |
This means that the file assert.o was not compiled with the -fPIC flag, which it should. When you fix this kind of error, make sure only objects that are used in shared libraries are compiled with -fPIC.
In this case, globally adding -fPIC to C[XX]FLAGS resolves the issue, although this practice is discouraged because the executables end up being PIC-enabled, too.
I was able to resolve the errors by exporting the -fPIC flags to the CC and CXX environmental variables, running ./configure again, and recompiling.
export CC=”gcc -fPIC”
export CXX=”g++ -fPIC”
make distclean; make clean
./configure
make
sudo make install
cd python
python setup.py build
sudo python setup.py install
It’s a nice win :) Hopefully next time I encounter this problem I’ll remember.
At any rate, now with pyfann working, I can now resume this tutorial on extracting paragraphs from html.
Keywords:
“relocation R_X86_64_32 against” “can not be used when making a shared object;” “recompile with -fPIC”
compiling, compilation, linux, errors, 64-bit, fPIC, fann, pyfann, ai, recompiling, recompilation, programming, code, coding, gcc, g++