


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
C和C++?件混合編譯?個項?中若同時存在.c?件和.cpp?件,該如何編譯呢??先,來看?下編譯的?些?知識:1.gcc編譯*.c/*.cpp?件依據(jù)各?的?件類型各?編譯為C型?標(biāo)?件和C++型?標(biāo)?件2.g++編譯*.c/*.cpp?件,都是編譯為C++類型的?標(biāo)?件3.在第2點基礎(chǔ)上,使?g++時,不論是*.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)了?章開頭的?知識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型?標(biāo)?件。和上?的?較起來,?中的hw.o就是C++型?標(biāo)?件三.test.cpp中的#include"hw.h"由extern“C”保護現(xiàn)在,移除調(diào)?中的對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這是因為在test.cpp中的extern"C#include"hw.h:test.cpp期望?個C型hw.o的?標(biāo)?件,然?在Makefile中使?了g++去編譯hw.c?成了C++型?標(biāo)?件,這就導(dǎo)致了問題產(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型?標(biāo)?件編譯,鏈接時使?g++進?鏈接將所有?件內(nèi)容恢復(fù)到原始狀態(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ù)各?件類型?成相應(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年福建省安全員B證(項目經(jīng)理)考試題庫
- 2025甘肅省安全員考試題庫及答案
- 氣壓帶風(fēng)帶與氣候?qū)W案 高中地理湘教版(2019)選擇性必修1
- 計算機輔助翻譯知到智慧樹章節(jié)測試課后答案2024年秋西華大學(xué)
- 地區(qū)產(chǎn)業(yè)結(jié)構(gòu)變化導(dǎo)學(xué)案 高二上學(xué)期地理人教版(2019)選擇性必修2+
- 科技企業(yè)知識產(chǎn)權(quán)的創(chuàng)造、保護與商業(yè)化
- 合同范本分包合同
- 第26課 教育文化事業(yè)的發(fā)展(教學(xué)設(shè)計)-2024-2025學(xué)年浙江省部編版歷史與社會八年級上冊
- 果樹栽植合同范本
- 外貿(mào)定制合同范本
- 米非司酮使用培訓(xùn)
- 二氧化碳捕集、運輸和地質(zhì)封存 - 地質(zhì)封存 征求意見稿
- 2024-2030年中國淀粉糖行業(yè)運行態(tài)勢與發(fā)展趨勢分析報告
- 診所信息保密和安全管理制度
- 護士臨床護理組長
- 土建、裝飾、維修改造等零星工程施工組織設(shè)計技術(shù)標(biāo)
- 高速公路養(yǎng)護作業(yè)安全培訓(xùn)內(nèi)容
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫
- 《大白菜種植栽培技》課件
- 北京工業(yè)大學(xué)《數(shù)據(jù)挖掘》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年物聯(lián)網(wǎng)安裝調(diào)試員(中級工)職業(yè)資格鑒定考試題庫(含答案)
評論
0/150
提交評論