有这样一种现象,本来所有连接都好好的,通过cmake然后多连接一个库后,本来找得到的函数也出现大量的undefined symbol错误。
可能的原因是在新的库的findPackdge中设置了GLIBCXX_USE_CXX11_ABI这个选项。
先解释ABI是什么。ABI叫做程序二进制接口,就是编译出来的bianry文件之间的调用的规则。比如低版本的gcc编译出来的print函数,想要在高版本gcc编译出来的程序调用就需要瞒住一定的ABI要求。c++11后有新的ABI标准。也就是用新标准编译的库只能调用其他同样用新标准编译的库的函数。不然就会出现找不到函数定义的错误。
GLIBCXX_USE_CXX11_ABI是用来开关使用新版ABI还是老版的。
举例:libtorch官方提供的bianry就是用旧版ABI编译的,所以在c++11中使用libtorch必须自己打开GLIBCXX_USE_CXX11_ABI,重新源码编译libtorch。