最近在嘗試用UDT進行通信,寫了兩個簡單的客戶端和服務端,但是編譯的時候出現了“error LNK2019: 無法解析的外部符號”錯誤,為了以后進行總結,還是把解決方法記錄下來。
1>------ 已啟動生成: 項目: udt_appserver, 配置: Debug Win32 ------
1>生成啟動時間為 2013/11/11 20:53:08。
1>InitializeBuildStatus:
1> 正在創建“Debug\udt_appserver.unsuccessfulbuild”,因為已指定“AlwaysCreate”。
1>ClCompile:
1> appserver.cpp
1>ResourceCompile:
1> 所有輸出均為最新。
1>ManifestResourceCompile:
1> 所有輸出均為最新。
1>api.obj : error LNK2019: 無法解析的外部符號 __imp__WSAGetLastError@0,該符號在函數 "public: int __thiscall CUDTUnited::startup(void)" (?startup@CUDTUnited@@QAEHXZ) 中被引用
1>channel.obj : error LNK2001: 無法解析的外部符號 __imp__WSAGetLastError@0
1>api.obj : error LNK2019: 無法解析的外部符號 __imp__WSAStartup@8,該符號在函數 "public: int __thiscall CUDTUnited::startup(void)" (?startup@CUDTUnited@@QAEHXZ) 中被引用
1>api.obj : error LNK2019: 無法解析的外部符號 __imp__WSACleanup@0,該符號在函數 "public: int __thiscall CUDTUnited::cleanup(void)" (?cleanup@CUDTUnited@@QAEHXZ) 中被引用
1>api.obj : error LNK2019: 無法解析的外部符號 __imp__getsockname@12,該符號在函數 "public: int __thiscall CUDTUnited::bind(int,unsigned int)" (?bind@CUDTUnited@@QAEHHI@Z) 中被引用
1>channel.obj : error LNK2001: 無法解析的外部符號 __imp__getsockname@12
1>api.obj : error LNK2019: 無法解析的外部符號 __imp__ntohs@4,該符號在函數 "private: void __thiscall CUDTUnited::updateMux(class CUDTSocket *,struct sockaddr const *,unsigned int const *)" (?updateMux@CUDTUnited@@AAEXPAVCUDTSocket@@PBUsockaddr@@PBI@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__freeaddrinfo@4,該符號在函數 "public: void __thiscall CChannel::open(struct sockaddr const *)" (?open@CChannel@@QAEXPBUsockaddr@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__getaddrinfo@16,該符號在函數 "public: void __thiscall CChannel::open(struct sockaddr const *)" (?open@CChannel@@QAEXPBUsockaddr@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__bind@12,該符號在函數 "public: void __thiscall CChannel::open(struct sockaddr const *)" (?open@CChannel@@QAEXPBUsockaddr@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__socket@12,該符號在函數 "public: void __thiscall CChannel::open(struct sockaddr const *)" (?open@CChannel@@QAEXPBUsockaddr@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__setsockopt@20,該符號在函數 "private: void __thiscall CChannel::setUDPSockOpt(void)" (?setUDPSockOpt@CChannel@@AAEXXZ) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__closesocket@4,該符號在函數 "public: void __thiscall CChannel::close(void)const " (?close@CChannel@@QBEXXZ) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__getsockopt@20,該符號在函數 "public: int __thiscall CChannel::getSndBufSize(void)" (?getSndBufSize@CChannel@@QAEHXZ) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__getpeername@12,該符號在函數 "public: void __thiscall CChannel::getPeerAddr(struct sockaddr *)const " (?getPeerAddr@CChannel@@QBEXPAUsockaddr@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__ntohl@4,該符號在函數 "public: int __thiscall CChannel::sendto(struct sockaddr const *,class CPacket &)const " (?sendto@CChannel@@QBEHPBUsockaddr@@AAVCPacket@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__WSASendTo@36,該符號在函數 "public: int __thiscall CChannel::sendto(struct sockaddr const *,class CPacket &)const " (?sendto@CChannel@@QBEHPBUsockaddr@@AAVCPacket@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__htonl@4,該符號在函數 "public: int __thiscall CChannel::sendto(struct sockaddr const *,class CPacket &)const " (?sendto@CChannel@@QBEHPBUsockaddr@@AAVCPacket@@@Z) 中被引用
1>channel.obj : error LNK2019: 無法解析的外部符號 __imp__WSARecvFrom@36,該符號在函數 "public: int __thiscall CChannel::recvfrom(struct sockaddr *,class CPacket &)const " (?recvfrom@CChannel@@QBEHPAUsockaddr@@AAVCPacket@@@Z) 中被引用
1>core.obj : error LNK2019: 無法解析的外部符號 __imp__getnameinfo@28,該符號在函數 "private: int __thiscall CUDT::listen(struct sockaddr *,class CPacket &)" (?listen@CUDT@@AAEHPAUsockaddr@@AAVCPacket@@@Z) 中被引用
1>epoll.obj : error LNK2019: 無法解析的外部符號 ___WSAFDIsSet@8,該符號在函數 "public: int __thiscall CEPoll::wait(int,class std::set<int,struct std::less<int>,class std::allocator<int> > *,class std::set<int,struct std::less<int>,class std::allocator<int> > *,__int64,class std::set<unsigned int,struct std::less<unsigned int>,class std::allocator<unsigned int> > *,class std::set<unsigned int,struct std::less<unsigned int>,class std::allocator<unsigned int> > *)" (?wait@CEPoll@@QAEHHPAV?$set@HU?$less@H@std@@V?$allocator@H@2@@std@@0_JPAV?$set@IU?$less@I@std@@V?$allocator@I@2@@3@2@Z) 中被引用
1>epoll.obj : error LNK2019: 無法解析的外部符號 _select@20,該符號在函數 "public: int __thiscall CEPoll::wait(int,class std::set<int,struct std::less<int>,class std::allocator<int> > *,class std::set<int,struct std::less<int>,class std::allocator<int> > *,__int64,class std::set<unsigned int,struct std::less<unsigned int>,class std::allocator<unsigned int> > *,class std::set<unsigned int,struct std::less<unsigned int>,class std::allocator<unsigned int> > *)" (?wait@CEPoll@@QAEHHPAV?$set@HU?$less@H@std@@V?$allocator@H@2@@std@@0_JPAV?$set@IU?$less@I@std@@V?$allocator@I@2@@3@2@Z) 中被引用
1>F:\C_TEST\test_udt\Debug\udt_appserver.exe : fatal error LNK1120: 20 個無法解析的外部命令
1>
1>生成失敗。
1>
1>已用時間 00:00:01.05
========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========
然后將各個問題進行定位,再手動添加各個.h文件,發現就是治標不治本,最后終於找到解決方法:
#pragma comment(lib,"ws2_32.lib")
也就是在是編寫的.cpp或者是.h文件的引用后添加上面那行就行了。
這句話的前面意思是靜態加入一個lib文件
也就是庫文件
ws2_32.lib文件,提供了對以下網絡相關API的支持,若使用其中的API,則應該將ws2_32.lib加入工程(否則需要動態載入ws2_32.dll)。
這句話一般出現在網絡編程中,需要使用網絡API函數的時候,就必須使用這條語句加載ws2_32.lib庫或者動態載入ws2_32.dll。
針對#pragma comment的具體使用方式請參考百度百科:#pragma comment