C / C ++コンパイラ混合計画問題

シナリオ1:C ++クラスインターフェースを呼び出すCプログラム

Makefileを次のように:

あなたはそれをコンパイルするために、G ++を使用する場合、何の問題は、あまりにも直接的ではありません。あなたはgccでコンパイルしようとすると、エラー

libpal_queueがpal_queue.cppあるので、あなたは、原因のリンク段階でmain.cの関数とlibpal_queueエラーリンクをgccのための試みに、リンクエラーを見ることができます

エドはアウト、GCCは、それがCに従って愚かなやり方に来るとき.cppファイルもC ++のに対処する方法は、その関数名のうち、一連が変更されていますが、main.oのリンクをたどるだろう会いました

ので、間違った機能を検索します。そして、使用したG ++とCはC ++、任意の問題がありませんので、リンクを処理することができます。

だから、結論は、Cは、リンクをコンパイルするためにC ++(C ++でクラス内のmain.cコールインタフェース)、使用gを++呼んでいます。(実際には、「コンパイル・ステージ、G ++ GCCを起動する、C ++のためのコードと2つの同等であるが、GCCコマンドがないライブラリ結合自動およびC ++プログラムを使用することができるので、それは一貫性のために、リンクを完了する++ Gと、通常、完全にすべて++グラムと/リンクをコンパイルし、そしてプログラムは唯一グラム++ cppを使用することができますかのように、これは、誤った印象を与える」様

G ++自動的にC ++標準ライブラリを接続します。GCCのC ++との接続プログラムがすることができますが、人々は、接続C ++標準ライブラリを指定する必要があり、そうでない場合は、未定義の参照があるだろう `__gxx_personality_v / 0「のエラーなど、GCCのgccの-lstdc ++ -o:あなたは++サンプルを-lstdc追加する必要があるコンパイラC ++プログラムのテストTEST.CPP

シナリオ2:C ++(Cの呼び出しインタフェースUNITTEST.cpp)Cを呼び出します

2.1グラム++コンパイルする([OK]を実行しているリンクを構築)

2.2使用のgccが同じ理由で、OK、リンクエラーをコンパイルし、コンパイルします。

CPPの詳細はhello_int_charに従って*ハローがまだ問題ではない_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
おすすめ