如何使用“-fPIC”标志重新编译 ntl 和 gmp 库并将 HELib 作为共享库以及对 func(std::ostream&) 错误的未定义引用

How to recompile ntl and gmp libraries with "-fPIC" flag & make HELib as a shared library & undefined reference to func(std::ostream&) error

内置于 HELib 共享库中的 C++ 代码正在使用 NTL 和 GMP 静态库。但出现以下错误:

/usr/bin/ld: /usr/local/lib/libntl.a(FFT.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libntl.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status

有人建议在post点击

使用“-fPIC”标志重新编译 NTL 和 GMP。 我找不到该怎么做。

编辑:

我现在可以构建共享库了: 通过以下方式重新编译 GMP 和 NTL: ./configure --enable-shared
对于 gmp 和 ./configure SHARED=on

安装 HELib 后。当我 运行 示例代码时出现错误。 link 到 Makefile :click to see makefile

错误:

g++ -g -O2 -std=c++11 -pthread -DFHE_THREADS -DFHE_BOOT_THREADS -DFHE_DCRT_THREADS -o Test_General_x Test_General.cpp -L/usr/local/lib -lntl -lgmp -lm -lfhe /usr/local/lib/libfhe.so: undefined reference to write_raw_int(std::ostream&, long, long)' /usr/local/lib/libfhe.so: undefined reference toread_raw_ZZ(std::istream&, NTL::ZZ&)' /usr/local/lib/libfhe.so: undefined reference to void write_raw_vector<long>(std::ostream&, std::vector<long, std::allocator<long> > const&)' /usr/local/lib/libfhe.so: undefined reference towriteEyeCatcher(std::ostream&, char const*)' /usr/local/lib/libfhe.so: undefined reference to write_raw_xdouble(std::ostream&, NTL::xdouble)' /usr/local/lib/libfhe.so: undefined reference toread_ntl_vec_long(std::istream&, NTL::Vec&)' /usr/local/lib/libfhe.so: undefined reference to void read_raw_vector<long>(std::istream&, std::vector<long, std::allocator<long> >&)' /usr/local/lib/libfhe.so: undefined reference toreadEyeCatcher(std::istream&, char const*)' /usr/local/lib/libfhe.so: undefined reference to read_raw_int(std::istream&, long)' /usr/local/lib/libfhe.so: undefined reference toread_raw_xdouble(std::istream&)' /usr/local/lib/libfhe.so: undefined reference to write_raw_ZZ(std::ostream&, NTL::ZZ const&)' /usr/local/lib/libfhe.so: undefined reference towrite_ntl_vec_long(std::ostream&, NTL::Vec const&, long)' collect2: error: ld returned 1 exit status Makefile:179: recipe for target 'Test_General_x' failed make: *** [Test_General_x] Error 1

Marc Glisse 为 question.For 第三部分的前两部分提供了答案 "Undefined Reference error" 答案是我没有编译和链接 x.cpp 包含的函数导致对我的共享库的未定义引用。因此检查:nm -CD /usr/local/lib/libfhe.so 以查看这些函数是否与链接地址一起列出。如果没有,则检查哪个代码提供了此功能。 Link 该代码到共享库。

至少对于 NTL v11.5.1,执行 ./configure --help | grep -i pic(如 GMP 评论之一所建议)根本没有帮助 - 它找不到匹配项。但是,在文件 ntl-11.5.1/src/DoConfig(第 17 行)中进行一行更改:

'CXXFLAGS'    => '-g -O2'

至:

'CXXFLAGS'    => '-g -O2 -fPIC',

帮我解决了问题。