我有一个库,它是我在Ubuntu18.04上编译的,使用的是build-essential
包中捆绑的gcc版本,即gcc 7.5.0。
如果我试图在Ubuntu20.04上编译一个应用程序,并链接到我之前使用默认的gcc版本,即gcc 9.3.0构建的库,那么我会得到一堆错误,比如对__expf_finite
的引用未定义。注意,我确实用-Ofast
编译了我的原始库,因为我需要利用所有的优化。根据libc SO this的问题,它表明libc更新不再支持math-finite.h
。
因此,作为一种可能的解决方案,我尝试了在Ubuntu 20.04上使用gcc 9.3.0编译我的库,然后看看是否可以使用Ubuntu 18.04上的gcc 7.5.0编译的应用程序来链接到该库(基本上与第一种情况相反)。然而,当我这样做时,我得到了std::string
的ABI compat错误
./trueface_sdk/libtf.a(ocl.cpp.o): In function `cv::ocl::Kernel::set(int, cv::ocl::KernelArg const&)':
ocl.cpp:(.text._ZN2cv3ocl6Kernel3setEiRKNS0_9KernelArgE+0x375): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
ocl.cpp:(.text._ZN2cv3ocl6Kernel3setEiRKNS0_9KernelArgE+0x49d): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../trueface_sdk/libtf.a(ocl.cpp.o): In function `oclCleanupCallback.cold':
ocl.cpp:(.text.unlikely.oclCleanupCallback+0x36): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
ocl.cpp:(.text.unlikely.oclCleanupCallback+0xcf): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
ocl.cpp:(.text.unlikely.oclCleanupCallback+0x184): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../trueface_sdk/libtf.a(ocl.cpp.o):ocl.cpp:(.text._ZN2cv3ocl6Device4ImplC2EPv[_ZN2cv3ocl6Device4ImplC5EPv]+0xb7b): more undefined references to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()' follow
../trueface_sdk/libtf.a(sqlite3.c.o):(.data.rel+0xb0): undefined reference to `fcntl64'
我还得到了对fcntl64
的未定义引用。
那么解决方案是什么呢?如何编译一个兼容多个版本的gcc的库?
发布于 2021-05-12 00:32:28
根据注释,它看起来不兼容,因为使用了-Ofast
编译器优化标志。
https://stackoverflow.com/questions/66976993
复制相似问题