![C和C++文件混合編譯_第1頁](http://file4.renrendoc.com/view/81567b1c550df9490e18d9e10c81b158/81567b1c550df9490e18d9e10c81b1581.gif)
![C和C++文件混合編譯_第2頁](http://file4.renrendoc.com/view/81567b1c550df9490e18d9e10c81b158/81567b1c550df9490e18d9e10c81b1582.gif)
![C和C++文件混合編譯_第3頁](http://file4.renrendoc.com/view/81567b1c550df9490e18d9e10c81b158/81567b1c550df9490e18d9e10c81b1583.gif)
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
C和C++?件混合編譯?個項?中若同時存在.c?件和.cpp?件,該如何編譯呢??先,來看?下編譯的?些?知識:1.gcc編譯*.c/*.cpp?件依據(jù)各?的?件類型各?編譯為C型?標?件和C++型?標?件2.g++編譯*.c/*.cpp?件,都是編譯為C++類型的?標?件3.在第2點基礎上,使?g++時,不論是*.c還是*.cpp都將鏈接stdc++庫。?gcc是?句各??件類型鏈接相應的stdc庫或者是stdc++庫4.gcc編譯*.c之后預定義的宏?較少5.gcc編譯*.cpp?件或者g++編譯之后,預定義的宏?較多。定義如下?件: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)了?章開頭的?知識1。使?nm命令查看hw.o中的符號root@hu-virtual-machine:/home/hu/project/c_#nmhw.oroot@hu-virtual-machine:/home/hu/project/c_#nmhw.o0000000000000000T_Z6get_hwv可以看到get_hw符號前,后都加了?些東西,先記在這?,和下?做對??.hw.h中的符號由extern"C"保護將hw.h中的內(nèi)容改變?yōu)橄?#ifndefHW_H#ifndefHW_H#defineHW_H#ifdefcplusplusextern"C"{#endifintget_hw();#ifdefcplusplus}#endif#endif沿?上?的Makefile,執(zhí)?make后,也能正常?成myexpect程序。這時,使?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型?標?件。和上?的?較起來,?中的hw.o就是C++型?標?件三.test.cpp中的#include"hw.h"由extern“C”保護現(xiàn)在,移除調(diào)?中的對hw.h的修改,恢復為原始的沒有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這是因為在test.cpp中的extern"C#include"hw.h:test.cpp期望?個C型hw.o的?標?件,然?在Makefile中使?了g++去編譯hw.c?成了C++型?標?件,這就導致了問題產(chǎn)?。針對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程序。這是因為使?gcc去編譯*.c?件,肯定會?成C型?標?件編譯,鏈接時使?g++進?鏈接將所有?件內(nèi)容恢復到原始狀態(tài)先看?下所有模塊由gcc編譯,再由gcc進?鏈接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++的?作嘛。其實不然,那是因為我們的例?代碼中沒有使?libstdc++中的任何內(nèi)容,?如將main.cpp做如下簡單修改#ifndef#ifndefTEST_H#include"test.h"#endif#include<iostream>usingstd::cout;usingstd::endl;intmain(intargc,char**argv){do_test();cout<<"hi"<<endl;return0;}這?上?這個Makefile后,會輸出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這??段的錯誤,這是因為編譯過程鏈接了libstdc的內(nèi)容,?iostream在libstdc++中。為了解決這個問題,這樣修改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ù)各?件類型?成相應的?標?件,最后?g++來指定鏈接libstdc++的內(nèi)容。使?nm命令觀察hw.o的內(nèi)容root@hu-virtual-machine:/home/hu/proje
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代辦公室空間的靈活性與可變性設計
- 現(xiàn)代物流人才培養(yǎng)與教育創(chuàng)新
- 學校記者團國慶節(jié)活動方案
- 現(xiàn)代企業(yè)的辦公自動化與多維度管理培訓體系構(gòu)建研究
- 現(xiàn)代企業(yè)家的自我管理與時間管理策略
- 現(xiàn)代汽車制造工藝的變革與教育新模式
- 現(xiàn)代企業(yè)決策中的核心能力體現(xiàn)
- 國慶節(jié)主題活動方案早教
- 2023三年級數(shù)學下冊 四 綠色生態(tài)園-解決問題第3課時說課稿 青島版六三制001
- 2024-2025學年高中歷史 專題八 當今世界經(jīng)濟的全球化趨勢 二 當今世界經(jīng)濟的全球化趨勢(3)教學說課稿 人民版必修2
- 2025年春季學期學校德育工作計劃安排表(完整版)
- 2025年有機肥行業(yè)發(fā)展趨勢分析報告
- 2024美團共享出行加盟合同
- 2023-2024年員工三級安全培訓考試題及參考答案(綜合題)
- 2024年人教版初中英語九年級全冊單元測評與答案
- 【渞法】學會自我保護教學設計 七年級道德與法治下冊(統(tǒng)編版2024)
- 2025-2030年中國融雪劑行業(yè)運行動態(tài)及發(fā)展前景預測報告
- DB31∕T 1043-2017 暴雨強度公式與設計雨型標準
- 2025保安部年度工作計劃
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術學院單招職業(yè)適應性測試題庫
評論
0/150
提交評論