請將schoolwork.c這個源文件添加入工程里,否則根本不會編譯到這個文件,只會編譯"源.cpp",然而"源.cpp"這個文件并沒有main函數(shù)。
在北關等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站建設、網(wǎng)站制作 網(wǎng)站設計制作按需定制設計,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站建設,全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,北關網(wǎng)站建設費用合理。
添加方法:
右鍵點擊“源文件”,在彈出菜單中選擇“添加”,在下級菜單中選擇“現(xiàn)有項”,此時出現(xiàn)文件瀏覽對話框
然后找到schoolwork.c,此后“源文件”這一欄里會出現(xiàn)schoolwork.c
再進行編譯即可。
這是因為c和c++混編帶來的問題。
1,問題根源:c++是支持類和名字空間,函數(shù)重載等高級技巧的。以函數(shù)重載為例:
int Add(int a, int b)
int Add(int a, int b, int c)
這意味著不同的函數(shù)有同樣的名字(你寫的,都叫Add),但是同樣的名字會帶來混淆,所以使用了一種叫“名字毀壞”的技術,不同的編譯器有不同的毀壞規(guī)則,只要能實現(xiàn)區(qū)分就好。
所以,經(jīng)過c++編譯器的處理,你的Add名字已經(jīng)面目全非,比如我這里叫:
錯誤 LNK2019 無法解析的外部符號 "int __fastcall Add(int,int)" (?Add@@YIHHH@Z),函數(shù) _main 中引用了該符號。
到這,都沒什么,只不過名字變了一下,只要編譯器能處理正確就好。
但是,重點來了,你放了一個c文件進去,c語言,是不支持這些高級玩意兒的,名字也不會毀壞,這樣,一個毀壞一個還是原名,得,兩下對不上了。
2,解決辦法
解決辦法也是模式化的,當你聲明的變量或者函數(shù)在c文件實現(xiàn)的時候,在h文件里聲明的時候,用這樣的結構包含起來,無論有多少個函數(shù),都可以放在一起。
#ifdef __cplusplus
extern "C" {
#endif
int Add(int, int);
//其他聲明
#ifdef __cplusplus
}
#endif
再編譯就不會出現(xiàn)Link錯誤了。
頭文件全文如下:
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int Add(int, int);
#ifdef __cplusplus
}
#endif
使用cl編譯的時候,不會自動幫你鏈接常用的系統(tǒng)庫,所以,需要你手動指定需要的庫文件。指定庫文件時,可以使用參數(shù)/link 庫文件,也可以直接寫庫文件名。
MessageBox函數(shù)族(編譯器會根據(jù)字符集自動判斷是使用后綴是A還是W的函數(shù))在庫文件User32.lib中,加上就行了,命令行:
cl G:\1.c User32.lib
注意我的源文件是在G盤下的,內(nèi)容和你的一樣。編譯結果:
你用VS2008吧,用它編譯的話,你這個能成功!
我問了一位高手,
講的是:“VC編譯器在編譯時不默認連接math.h函數(shù)”
它不屬于C運行庫,所以沒有默認鏈接
后來用了VS2008,發(fā)現(xiàn)成功了。