C/C++混合编程编译问题

情景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

猜你喜欢

转载自www.cnblogs.com/Arnold-Zhang/p/11241757.html