——《软件调试实战》
C++的命名空间、类、模板或函数重载等特征使得编译和链接更为复杂,这使得符号的不匹配更有可能引发链接问题。甚至利用C和C++编译器编译相同的C源代码也会得到不同的符号。
1 符号的反改编(demangle)
为观察经过名称改编的符号,可以对这些符号进行反改编。有两种反改编方法:一是使用实用程序(analysis utility),它们可以在改编和反改编之间切换;二是使用过滤器,如c++filt。通过选项-C或–demingle可以调用实际的用户级别的符号名称。
2 连接C和C++代码
仅使用C编译器驱动程序并不能保证源代码实际上被编译为C代码,编译器驱动程序可能根据文件扩展名来决定生成C或C++风格的符号。例如,如果用gcc编译 .c 文件,则此文件被编译为C代码,而扩展名为 .cc, .cpp, .cxx 的文件则被编译为C++代码。
C++经常需要连接C对象文件中的符号,这往往导致链接上的问题。解决方法是明确地通知C++编译器不对哪些需要由C对象文件中的符号来解析的未定义符号进行名称改编。这可以通过在相应声明中使用extern "C"
编译器指令来实现。
如下声明,可使函数factorail()被C++编译器编译后,仍可链接到C