C和C++文件混合編譯_第1頁
C和C++文件混合編譯_第2頁
C和C++文件混合編譯_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C和C++?件混合編譯?個(gè)項(xiàng)?中若同時(shí)存在.c?件和.cpp?件,該如何編譯呢??先,來看?下編譯的?些?知識(shí):1.gcc編譯*.c/*.cpp?件依據(jù)各?的?件類型各?編譯為C型?標(biāo)?件和C++型?標(biāo)?件2.g++編譯*.c/*.cpp?件,都是編譯為C++類型的?標(biāo)?件3.在第2點(diǎn)基礎(chǔ)上,使?g++時(shí),不論是*.c還是*.cpp都將鏈接stdc++庫。?gcc是?句各??件類型鏈接相應(yīng)的stdc庫或者是stdc++庫4.gcc編譯*.c之后預(yù)定義的宏?較少5.gcc編譯*.cpp?件或者g++編譯之后,預(yù)定義的宏?較多。定義如下?件:hw.chw.hmain.cpptest.cpphw.chw.hmain.cpptest.cpptest.hmain模塊調(diào)?test模塊,test模塊調(diào)?hw模塊#ifndefHW_H#defineHW_H#ifndefHW_H#defineHW_Hintget_hw();#endifhw.c#ifndefHW_H#ifndefHW_H#include"hw.h"#endifintget_hw(){return100;}test.h#ifndefTEST_H#ifndefTEST_H#defineTEST_Hvoiddo_test();#endiftest.cpp#ifndef#ifndefTEST_H#include"test.h"#endif#ifndefHW_H#include"hw.h"#endif#include<stdio.h>voiddo_test(){printf("hw:%d\n",get_hw());}main.cpp#ifndef#ifndefTEST_H#include"test.h"#endifintmain(intargc,char**argv){do_test();return0;}myexpect:main.ohw.otest.og++myexpect:main.ohw.otest.og++-omyexpectmain.ohw.otest.omain.o:main.cppg++-cmain.cpphw.o:hw.cg++-chw.ctest.o:test.cppg++-ctest.cpp在鍵?make后可以成功?成myexpect程序。這體現(xiàn)了?章開頭的?知識(shí)1。使?nm命令查看hw.o中的符號(hào)root@hu-virtual-machine:/home/hu/project/c_#nmhw.oroot@hu-virtual-machine:/home/hu/project/c_#nmhw.o0000000000000000T_Z6get_hwv可以看到get_hw符號(hào)前,后都加了?些東西,先記在這?,和下?做對(duì)??.hw.h中的符號(hào)由extern"C"保護(hù)將hw.h中的內(nèi)容改變?yōu)橄?#ifndefHW_H#ifndefHW_H#defineHW_H#ifdefcplusplusextern"C"{#endifintget_hw();#ifdefcplusplus}#endif#endif沿?上?的Makefile,執(zhí)?make后,也能正常?成myexpect程序。這時(shí),使?nm?具,觀察hw.oroot@hu-virtual-machine:/home/hu/project/c_#nmhw.o0000000000000000Tget_hwroot@hu-virtual-machine:/home/hu/project/c_#nmhw.o0000000000000000Tget_hw多么的明了,多么的?凈,顯然,get_hw沒有經(jīng)過修改,所以,hw.o就是C型?標(biāo)?件。和上?的?較起來,?中的hw.o就是C++型?標(biāo)?件三.test.cpp中的#include"hw.h"由extern“C”保護(hù)現(xiàn)在,移除調(diào)?中的對(duì)hw.h的修改,恢復(fù)為原始的沒有extern"C"的內(nèi)容。將test.cpp改變?yōu)槿缦?ifndefTEST_H#ifndefTEST_H#include"test.h"#endif#ifndefHW_Hiextern"C"{#include"hw.h"}#endif#include<stdio.h>voiddo_test(){printf("hw:%d\n",get_hw());}依然沿?上?的Makefile,執(zhí)?make后輸出g++-cmain.cppg++-chw.cg++-cmain.cppg++-chw.cg++-ctest.cppg++-omyexpectmain.ohw.otest.otest.o:Infunction`do_test()':test.cpp:(.text+0x5):undefinedreferenceto`get_hw'collect2:error:ldreturned1exitstatusmake:***[myexpect]Error1這是因?yàn)樵趖est.cpp中的extern"C#include"hw.h:test.cpp期望?個(gè)C型hw.o的?標(biāo)?件,然?在Makefile中使?了g++去編譯hw.c?成了C++型?標(biāo)?件,這就導(dǎo)致了問題產(chǎn)?。針對(duì)Makefile做如下修改myexpect:main.ohw.otest.omyexpect:main.ohw.otest.og++-omyexpectmain.ohw.otest.omain.o:main.cppg++-cmain.cpphw.o:hw.cgcc-chw.ctest.o:test.cppg++-ctest.cpp執(zhí)?make后可以正常?成myexpect程序。這是因?yàn)槭?gcc去編譯*.c?件,肯定會(huì)?成C型?標(biāo)?件編譯,鏈接時(shí)使?g++進(jìn)?鏈接將所有?件內(nèi)容恢復(fù)到原始狀態(tài)先看?下所有模塊由gcc編譯,再由gcc進(jìn)?鏈接myexpect:main.ohw.otest.omyexpect:main.ohw.otest.ogcc-omyexpectmain.ohw.otest.omain.o:main.cppgcc-cmain.cpphw.o:hw.cgcc-chw.ctest.o:test.cppgcc-ctest.cppPHONY:cleanclean:rm-rf*.omyexpect執(zhí)?make后,可以正常?成myexpect程序。似乎gcc完全可以勝任g++的?作嘛。其實(shí)不然,那是因?yàn)槲覀兊睦?代碼中沒有使?libstdc++中的任何內(nèi)容,?如將main.cpp做如下簡(jiǎn)單修改#ifndef#ifndefTEST_H#include"test.h"#endif#include<iostream>usingstd::cout;usingstd::endl;intmain(intargc,char**argv){do_test();cout<<"hi"<<endl;return0;}這?上?這個(gè)Makefile后,會(huì)輸出gcc-cmain.cppgcc-chw.cgcc-ctest.cppgcc-omyexpectmain.ohw.otest.omain.o:Infunction`main':main.cpp:(.text+0x1a):undefinedreferenceto`std::cout'main.cpp:(.text+0x1f):undefinedreferenceto`std::basic_ostream<char,std::char_traits<char>>&std::operator<<<std::char_traits<char>>(std::basic_ostream<cmain.cpp:(.text+0x24):undefinedreferenceto`std::basic_ostream<char,std::char_traits<char>>&std::endl<char,std::char_traits<char>>(std::basic_ostream<chmain.cpp:(.text+0x2c):undefinedreferenceto`std::ostream::operator<<(std::ostream&(*)(std::ostream&))'main.o:Infunction`static_initialization_and_destruction_0(int,int)':main.cpp:(.text+0x5a):undefinedreferenceto`std::ios_base::Init::Init()'main.cpp:(.text+0x69):undefinedreferenceto`std::ios_base::Init::~Init()'collect2:error:ldreturned1exitstatusmake:***[myexpect]Error1這??段的錯(cuò)誤,這是因?yàn)榫幾g過程鏈接了libstdc的內(nèi)容,?iostream在libstdc++中。為了解決這個(gè)問題,這樣修改Makefilemyexpect:main.ohw.otest.omyexpect:main.ohw.otest.og++-omyexpectmain.ohw.otest.omain.o:main.cppgcc-cmain.cpphw.o:hw.cgcc-chw.ctest.o:test.cppgcc-ctest.cppPHONY:cleanclean:rm-rf*.omyexpect?gcc去依據(jù)各?件類型?成相應(yīng)的?標(biāo)?件,最后?g++來指定鏈接libstdc++的內(nèi)容。使?nm命令觀察hw.o的內(nèi)容root@hu-virtual-machine:/home/hu/proje

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論