如何使用-Oast保持gcc7和gcc9之间的兼容性



我有一个库,我在Ubuntu 18.04上使用捆绑在build-essential包gcc 7.5.0中的gcc版本编译了它。

如果我试图在Ubuntu 20.04上编译一个应用程序,并链接到我以前使用默认gcc版本gcc 9.3.0构建的库,那么我会收到一堆错误,比如对__expf_finite的未定义引用。注意,我确实使用-Ofast编译了我的原始库,因为我需要利用所有的优化。根据这个SO问题,这表明libc更新不再支持math-finite.h

因此,作为一个可能的解决方案,我尝试使用gcc 9.3.0在Ubuntu 20.04上编译我的库,然后看看我是否可以使用在Ubuntu 18.04上使用gcc 7.5.0编译的应用程序来链接该库(基本上与第一种情况相反(。然而,当我这样做时,我会得到std::string:的ABI兼容错误

./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兼容的库?

根据注释,由于使用了-Ofast编译器优化标志,它看起来不兼容。

最新更新