情景1: C程序里面调用C++的类的接口
Makefile为:
如果用g++编译的话,没问题直接过。如果企图用gcc去编译的话,报错
可以看到是个链接错误,这是由于gcc在链接阶段企图把main.c中的函数和libpal_queue进行链接时出错,因为libpal_queue是pal_queue.cpp
编出来的,gcc碰到.cpp文件也是会按照C++的方式去处理的,因此编出来的函数名是修饰过的,而main.o在链接的时候还傻乎乎的按照c的方式去
找函数,所以就出错了。而使用g++则可以同时处理C和C++,因此链接的时候也不会有什么问题。
所以结论就是,C调用C++(main.c中调用C++的一个类的接口)的情况,使用g++去编译链接。(实际上,“编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接, 所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用 g++似的”)
g++ 会自动进行 C++ 标准库的连接;用 gcc 连接 C++ 程序也可以,但是需要人为指定连接 C++ 标准库,否则就会出现undefined reference to `__gxx_personality_v/0' 之类的错误,gcc编译 c++ 程序需要添加 -lstdc++ sample: gcc -lstdc++ -o test test.cpp
情景2:C++中调用C(UNITTEST.cpp中调用一个C的接口)
2.1 使用g++去编(编译链接运行OK)
2.2 使用gcc去编,编译OK,出现链接错误,原因同上。
详细的说就是CPP中按照hello_int_char*去链接hello中的_hello符号,这不就出问题了吗!
3. 针对上面的情况,该怎么用extern "C" {}去解决这个问题呢?
说道这个,就不得不说说__cplusplus宏,“实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译 器,则该宏就是未定义的,否则,就是已定义”。也就是说,如果我们使用g++,或者文件后缀是.cpp,那么这个宏都是被定义的。
=====================================================================================
4. 好吧,有点尴尬
我发现用g++去编,根本不受extern "C"的影响,有没有它都能正常编译通过并运行。
这也是个问题,说好的符号链接不上呢?
而用gcc去编,有没有extern "C"都不对
加上extern "C"后,好像好了一点,起码对hello的引用是对的了
但是剩下的两个问题怎么也搞不定了,有的人说用gcc -stdc++可以解决,我试了,没有用。
好吧,问题先放在这,后面打算一步步地去跟,看汇编符号,看链接过程到底是什么样的
如果有知道原因的朋友欢迎在下面留言,不胜感激。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TBD before 2019/8/1