㈠ C語言出現無法解析的外部命令情況是怎麼回事,我把結構數據的聲明和定義都放在頭文件中:
這個extern是聲明而非定義,它表示first在別的某處,肯定是你在別的地方沒有定義。
你可以在和該頭文件對應的cpp文件中定義這三個變數。
直接在頭文件定義(即去掉extern)是不好的做法,如果多個cpp一起編譯,它們引用了不止一次這個頭文件,會出現重復定義的錯誤。
最佳的做法是,一處定義,多處聲明。
㈡ c++無法解析的外部命令
函數就是 void main() 寫錯了,是void main()不是void mian(),如果不是主函數就是沒有添加相應的頭文件。
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: 無法解析的外部符號 _main,該符號在函數 ___tmainCRTStartup 中被引用。
這句話的意思是void mian()函數在某個類中,沒有添加累的頭文件。
注意事項
1、在調用外部庫的時候,出現這種問題,可能就是庫調用的方式不對,在QT中調用的時候,可以在.pro文件中加入庫,或者可以在頭文件中使用
#pragma comment(lib, 「HITP450.lib」);
2、排除了這種問題,接下來就有可能調用了沒有進行聲明的函數,檢查一下是否在頭文件中進行定義。
3、配置屬性-常規-mfc的使用,選擇為使用標准Windows庫,或者選擇在靜態庫中使用mfc,並且在程序中添加 #pragma comment (lib,"Advapi32.lib") 或者在項目-屬性-鏈接器-輸入-附加依賴項 中添加相應的庫名字,但是該庫的文件路徑最好跟當前項目的路徑是一樣的,否則需要在項目-屬性-vc++目錄-庫目錄 裡面加上該庫的目錄,否則找不到該庫
4、重要一定要確定好,lib的位數和編譯器的位數選擇是一致的。
㈢ win7 安裝qt vs2010配置boost,CGAL等
一、安裝cmake
1、這一步比較簡單,下載安裝最新版本cmake-2.8,開始如下安裝
2、注意這里選擇第二個選項,為所有的用戶添加系統變數
3、選擇安裝到目錄 F:\CMake 2.8,個人建議最好安裝在C盤目錄下。
4、安裝完畢後確認一下系統變數中有沒有紅色框中的目錄,若沒有需要手動添加進去。
5、cmake安裝完畢!
二、安裝Boost庫
1、下載最新版本,當前為boost_1_55_0
2、按 Win+R組合鍵輸入cmd進入命令窗口:
切換當前目錄為boost的安裝目錄(G:\boost_1_55_0),輸入bootstrap.bat
3、執行完上述命令後會在安裝目錄下生成如下exe文件
4、繼續在DOS窗口中輸入bjam.exe,程序會根據你當前安裝的編譯環境(vs2010,vs2012,vs2013)等自動選擇與之相適應的庫文件和包含文件等。
此過程大概需要20分鍾左右。根據下面第二個圖片可以算出我的編譯環境為MSVC-12.0即VS2013.
5、20分鍾左右後可以看到如下界面,說明Boost庫配置完成
三、安裝CGAL
1、下載CGAL,這里我下載的是CGAL-4.4這個版本(當前最新的)
2、安裝位數選擇32位
如果選擇64位進行安裝,則會在以後配置完畢後出現類似「無法識別的外部符號。。。」等問題,很難進行正確配置。所以這里最好全部選擇32位進行安裝。
3、安裝目錄我選擇C:\Program Files\CGAL-4.4
安裝在其他目錄時可能會出現用Cmake編譯時出現好幾外錯誤。可以嘗試通過安裝在C盤進行解決。
4、選擇如下幾項,單擊下一步
5、安裝完成後可能會出現如下提示,則需要手動添加F:\CGAL-4.4\auxiliary\gmp\lib到Path變數中
6、此時CGAL安裝完成
四、用Cmake配置CGAL庫
1、打開Cmake軟體選擇如下目錄,註:兩個目錄是相同的
2、單擊「config"-選擇如下編譯器(默認是32位,與前面安裝軟體一定要保持一致)
3、單擊確定後,出現如下界面說明配置成功
4、找到如下圖的這一項,選中,再次單擊"config"進行配置
5、單擊Generate,此時界面應如下。
6、此時在CGAL安裝目錄下出現如下文件:CGAL.sln
7、打開此文件,此時編譯器會自動組建一個解決方案。如下圖
8、選擇32位debug模式,按F7進行編譯,編譯完成後如下圖所示,表明CGAL至此完全配置成功。
五、舉例測試CGAL
新建一個控制台應用程序,並添加如下代碼
#include <iostream>
#include <boost/format.hpp>
#include <QtGui>
#include <CGAL/Qt/GraphicsViewNavigation.h>
#include <QLineF>
#include <QRectF>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect(0,0, 100, 100);
scene.addRect(QRectF(0,0, 100, 100), QPen(QColor(255,0,0)));
scene.addLine(QLineF(0,0, 100, 100));
scene.addLine(QLineF(0,100, 100, 0));
QGraphicsView* view = new QGraphicsView(&scene);
CGAL::Qt::GraphicsViewNavigation navigation;
view->installEventFilter(&navigation);
view->viewport()->installEventFilter(&navigation);
view->setRenderHint(QPainter::Antialiasing);
view->show();
return app.exec();
}
添加包含庫目錄,操作如下圖,注意紅色框中的添加內容
添加附加庫目錄,操作如下圖,注意紅色框中的添加內容
直接編譯運行此時會出現如下錯誤,別急,我們離成功只差一步了
>test.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall QColor::QColor(int,int,int,int)" (__imp_??0QColor@@QAE@HHHH@Z),該符號在函數 _main 中被引用
1>test.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall QBrush::QBrush(void)" (__imp_??0QBrush@@QAE@XZ),該符號在函數 _main 中被引用
1>test.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall QBrush::~QBrush(void)" (__imp_??1QBrush@@QAE@XZ),該符號在函數 _main 中被引用
1>test.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: void __thiscall QWidget::show(void)" (__imp_?show@QWidget@@QAEXXZ),該符號在函數 _main 中被引用
1>test.obj : error LNK2001: 無法解析的外部符號 "protected: virtual bool __thiscall QWidget::winEvent(struct tagMSG *,long *)" (?winEvent@QWidget@@MAE_NPAUtagMSG@@PAJ@Z)
1>test.obj : error LNK2001: 無法解析的外部符號 "protected: virtual void __thiscall QWidget::windowActivationChange(bool)" (?windowActivationChange@QWidget@@MAEX_N@Z)
1>G:\Cpp\Midaxis\CGAL512\Debug\CGAL512.exe : fatal error LNK1120: 81 個無法解析的外部命令
添加附加依賴項。
選擇「鏈接器」---「輸入」,在其中輸入如下添加LIB文件
phonon4.libQAxContainer.libQtCLucene4.libQtCore4.libQtDeclarative4.libQtDesigner4.libQtGui4.libqtmain.libQtOpenGL4.lib
再次編譯運行,即可大功告成了!
㈣ 用c語言編程序,遇到無法解析的外部符號,求解決方法
使用cl編譯的時候,不會自動幫你鏈接常用的系統庫,所以,需要你手動指定需要的庫文件。指定庫文件時,可以使用參數/link
庫文件,也可以直接寫庫文件名。
MessageBox函數族(編譯器會根據字元集自動判斷是使用後綴是A還是W的函數)在庫文件User32.lib中,加上就行了,命令行:
cl
G:\1.c
User32.lib
注意我的源文件是在G盤下的,內容和你的一樣。編譯結果:
㈤ C程序編譯時提示無法解析的外部命令
int contiune_function(void)
{
printf("
Do you wish to continue? (0=NO/1=YES: ");
scanf("%d", &x);
這里名字寫錯了,應該是:continue_function
intcontinue_function()
{
printf(" Doyouwishtocontinue?(0=NO/1=YES:");
scanf("%d",&x);
while(x<0||x>1)
{
printf(" %disinvalid!",x);
printf(":");
scanf("%d",&x);
}
if(x==0)
return(NO);
else
return(YES);
}
㈥ c語言編譯錯誤 fatal error LNK1120: 1 個無法解析的外部命令
出這個錯是你建立程序的時候工程選錯了,選成了 Win32 Application
應該是 win32 Console Application
和 .c .cpp沒有一毛錢關系
㈦ C語言中顯示無法解析的外部命令
這是因為c和c++混編帶來的問題。
1,問題根源:c++是支持類和名字空間,函數重載等高級技巧的。以函數重載為例:
int Add(int a, int b)
int Add(int a, int b, int c)
這意味著不同的函數有同樣的名字(你寫的,都叫Add),但是同樣的名字會帶來混淆,所以使用了一種叫「名字毀壞」的技術,不同的編譯器有不同的毀壞規則,只要能實現區分就好。
所以,經過c++編譯器的處理,你的Add名字已經面目全非,比如我這里叫:
錯誤 LNK2019 無法解析的外部符號 "int __fastcall Add(int,int)" (?Add@@YIHHH@Z),函數 _main 中引用了該符號。
到這,都沒什麼,只不過名字變了一下,只要編譯器能處理正確就好。
但是,重點來了,你放了一個c文件進去,c語言,是不支持這些高級玩意兒的,名字也不會毀壞,這樣,一個毀壞一個還是原名,得,兩下對不上了。
2,解決辦法
解決辦法也是模式化的,當你聲明的變數或者函數在c文件實現的時候,在h文件里聲明的時候,用這樣的結構包含起來,無論有多少個函數,都可以放在一起。
#ifdef __cplusplus
extern "C" {
#endif
int Add(int, int);
//其他聲明
#ifdef __cplusplus
}
#endif
再編譯就不會出現Link錯誤了。
頭文件全文如下:
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int Add(int, int);
#ifdef __cplusplus
}
#endif
㈧ c語言 error 無法解析的外部符號
是main()
不是 mian()
㈨ c語言無法解析的外部符號
請將schoolwork.c這個源文件添加入工程里,否則根本不會編譯到這個文件,只會編譯"源.cpp",然而"源.cpp"這個文件並沒有main函數。
添加方法:
右鍵點擊「源文件」,在彈出菜單中選擇「添加」,在下級菜單中選擇「現有項」,此時出現文件瀏覽對話框
然後找到schoolwork.c,此後「源文件」這一欄里會出現schoolwork.c
再進行編譯即可。
㈩ C程序 無法解析的外部符號
你應該在hotel.h頭文件的函數前面加入extern,以表明這是可以被外部文件訪問的函數,
例如:
extern getnights(void);
另外,在編寫頭文件的時候,應該編寫頭文件保護代碼,
在頭文件的開始處,加入:
#ifndef HOTEL_H
#define HOTEL_H
在頭文件末尾,加入:
#endif