I use NTL on ArchLinux
, and there is a struct _ntl_gbigint_body
which is actually not defined (refer this post):
/*
* This way of defining the bigint handle type is a bit non-standard,
* but better for debugging.
*/
struct _ntl_gbigint_body;
typedef _ntl_gbigint_body *_ntl_gbigint;
You should pay attention to functions who depend on this struct, such as:
void _ntl_gcopy(_ntl_gbigint a, _ntl_gbigint *bb)
Because for old NTL
library, the function prototype generated by compiler is _ntl_gcopy(void*, void**)
:
$ readelf -sW libntl.so | c++filt | grep ntl_gcopy
2511: 000000000012b750 184 FUNC GLOBAL DEFAULT 12 _ntl_gcopy(void*, void**)
While for new one it is _ntl_gcopy(_ntl_gbigint_body*, _ntl_gbigint_body**)
:
$ readelf -sW libntl.so | c++filt | grep ntl_gcopy
615: 0000000000148500 202 FUNC GLOBAL DEFAULT 11 _ntl_gcopy(_ntl_gbigint_body*, _ntl_gbigint_body**)
So if you meet linking error as following:
undefined reference to `_ntl_gcopy(void*, void**)'
It should be NTL
header files and library mismatch. The header files are old, while library is new.
So, the solution would be to install an earlier version of NTL?
The solution is the header and library’ versions should match.