如何使用“-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 to
read_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 to
writeEyeCatcher(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 to
read_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 to
readEyeCatcher(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 to
read_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 to
write_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',
帮我解决了问题。
内置于 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 to
read_raw_ZZ(std::istream&, NTL::ZZ&)' /usr/local/lib/libfhe.so: undefined reference tovoid write_raw_vector<long>(std::ostream&, std::vector<long, std::allocator<long> > const&)' /usr/local/lib/libfhe.so: undefined reference to
writeEyeCatcher(std::ostream&, char const*)' /usr/local/lib/libfhe.so: undefined reference towrite_raw_xdouble(std::ostream&, NTL::xdouble)' /usr/local/lib/libfhe.so: undefined reference to
read_ntl_vec_long(std::istream&, NTL::Vec&)' /usr/local/lib/libfhe.so: undefined reference tovoid read_raw_vector<long>(std::istream&, std::vector<long, std::allocator<long> >&)' /usr/local/lib/libfhe.so: undefined reference to
readEyeCatcher(std::istream&, char const*)' /usr/local/lib/libfhe.so: undefined reference toread_raw_int(std::istream&, long)' /usr/local/lib/libfhe.so: undefined reference to
read_raw_xdouble(std::istream&)' /usr/local/lib/libfhe.so: undefined reference towrite_raw_ZZ(std::ostream&, NTL::ZZ const&)' /usr/local/lib/libfhe.so: undefined reference to
write_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',
帮我解决了问题。