1.编译器“内联函数开关”引起的错误:


     近来使用GCC,"Hello,World"都进行的挺顺利,但是到编译自定义类时却问题多多。程序的目的是实现C++下的字符串类,非常简单,源文件有三个:

       String.h        //类定义的头文件

       String.cxx      //类实现文件

       teststring.cxx //类测试文件

     编译时反复出现“undefined reference to XXX”提示,经过参阅手册得知解决办法:

     由于String.h所有函数在实现文件String.cxx中均显式声明为内联,根据g++编译的默认选项是-fno-keep- inline-functions,如果函数被内联,则不存在对函数的调用,编译程序将不生成函数体,因此虽然teststring.cxx中 include了相关函数的定义,但是找不到这些函数的实现,自然出现错误"undefined reference to XXX"。
修改该选项为-fkeep-inline-functions,则及时不存在对函数的调用,编译程序也会生成函数体,于是世界又清静了。


2.C++编译器的机制问题



 undefined reference to`错误,找不到库函数。


 


     main.c:(.text+0x15): undefined reference to `MemoryContextInit()'


     main.c:(.text+0x26): undefined reference to `MemoryContextDestory()'


 


     用gcc编译就可以通过。


 


     其实,代码不是面向对象的c++语言,开始没有想到是c++调用c函数的问题。


     开始是以为库的路径不对;make文件中库的顺序不对;等等方法,都没有效果。


     百试不得出路之后,才发现是extern “C”的问题。


 


     用g++编译c的库函数,没有问题,可以生成目标文件.o,但是c++的命名机制已经将调用的库函数改名称了。所以必须在c库函数前加上 extern “C”。


 


     如果一个一个函数转换,是可行的


     extern “C” MemoryContextInit() ;



    但是为了 能够一次完全转换,采用将整个库的头文件引用改为如下方式:


extern "C"


{


#include "../lib/libxxx.h"


}


该方法改写于原文:http://xiaomage.blog.51cto.com/293990/72755





感谢“细雨邻家”和“小马哥”提供的参考!由于本人没有相应的账号,无法留言感谢,特在此注明,谢谢原作者!