以下是我查找到的网上的解决方法:
1.问题解决:FFmpeg视频编解码库,无法解析的外部信号
在编译FFmpeg相关项目时,可能会出现:
error LNK2019: 无法解析的外部符号 "int __cdecl avpicture_fill(struct AVPicture *,unsigned char const *,enum AVPixelFormat,int,int)" (?avpicture_fill@@YAHPAUAVPicture@@PBEW4AVPixelFormat@@HH@Z),该符号在函数"bool __cdecl YV12ToBGR24_FFmpeg(unsigned char *,unsigned char *,int,int)" (?YV12ToBGR24_FFmpeg@@YA_NPAE0HH@Z) 中被引用
error LNK2019: 无法解析的外部符号 "void __cdecl sws_freeContext(struct SwsContext *)" (?sws_freeContext@@YAXPAUSwsContext@@@Z),该符号在函数"bool __cdecl YV12ToBGR24_FFmpeg(unsigned char *,unsigned char *,int,int)" (?YV12ToBGR24_FFmpeg@@YA_NPAE0HH@Z) 中被引用
这种类似情况,在检查包含目录、库目录、链接器输入和系统环境变量均设置无误的情况下,包含的文件要写成以下形式:
extern "C"
{
#include
#include
#include
#include
#include
};
这种情况是因为,头文件中的函数定义在编译为 C 程序的文件中,而头文件是在 C++ 文件中不带 extern “C” 修饰符声明的。在此情况下,需要添加
extern "C"
修饰符。
类似的,定义在编译为 C 程序的文件中的符号, 若要在C++ 文件中进行声明,不可使用:
extern int i;
extern void g();
而应该使用:
extern "C" int i;
extern "C" void g();
详细的解释:http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html
转自:http://blog.csdn.net/liyuefeilong/article/details/50252029
--------------------------------------------------------------------------------------------------------------------------
2.
无法解析的外部符号问题小结
问题1:在编写通信相关程序中,引用了一个静态库(该静态库编译没有问题,并被其他项目引用),该库是对SOCKET的一个封装。基本结构如下:
在属性中添加了该库的引用后,编译仍然报错,错误如下:
safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _gethostbyname@4,该符号在函数 "public: __thiscall tcpsocket::Socket::Socket(char const *,short)" (??0Socket@tcpsocket@@QAE@PBDF@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _inet_addr@4,该符号在函数 "public: __thiscall tcpsocket::Socket::Socket(char const *,short)" (??0Socket@tcpsocket@@QAE@PBDF@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _WSAGetLastError@0,该符号在函数 "public: __thiscall tcpsocket::Socket::Socket(char const *,short)" (??0Socket@tcpsocket@@QAE@PBDF@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _socket@12,该符号在函数 "public: __thiscall tcpsocket::Socket::Socket(char const *,short)" (??0Socket@tcpsocket@@QAE@PBDF@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _send@16,该符号在函数 "public: virtual unsigned int __thiscall tcpsocket::Socket::send(char const *,unsigned int)" (?send@Socket@tcpsocket@@UAEIPBDI@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _recv@16,该符号在函数 "public: virtual unsigned int __thiscall tcpsocket::Socket::receive(char *,unsigned int)" (?receive@Socket@tcpsocket@@UAEIPADI@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _closesocket@4,该符号在函数 "public: virtual void __thiscall tcpsocket::Socket::close(void)" (?close@Socket@tcpsocket@@UAEXXZ) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _getpeername@12,该符号在函数 "public: virtual void __thiscall tcpsocket::Socket::getPeerName(struct sockaddr_in *)" (?getPeerName@Socket@tcpsocket@@UAEXPAUsockaddr_in@@@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _getsockopt@20,该符号在函数 "private: void __thiscall tcpsocket::BufferedSocket::init(int)" (?init@BufferedSocket@tcpsocket@@AAEXH@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _listen@8,该符号在函数 "public: __thiscall tcpsocket::ServerSocket::ServerSocket(short,unsigned long,int)" (??0ServerSocket@tcpsocket@@QAE@FKH@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _bind@12,该符号在函数 "public: __thiscall tcpsocket::ServerSocket::ServerSocket(short,unsigned long,int)" (??0ServerSocket@tcpsocket@@QAE@FKH@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _setsockopt@20,该符号在函数 "public: __thiscall tcpsocket::ServerSocket::ServerSocket(short,unsigned long,int)" (??0ServerSocket@tcpsocket@@QAE@FKH@Z) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _accept@12,该符号在函数 "public: class tcpsocket::Socket __thiscall tcpsocket::ServerSocket::acceptConnection(void)" (?acceptConnection@ServerSocket@tcpsocket@@QAE?AVSocket@2@XZ) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _WSAStartup@8,该符号在函数 "public: __thiscall _WSAINIT::_WSAINIT(void)" (??0_WSAINIT@@QAE@XZ) 中被引用
1>safmq2005.lib(tcpsocket.obj) : error LNK2019: 无法解析的外部符号 _WSACleanup@0,该符号在函数 "public: __thiscall _WSAINIT::~_WSAINIT(void)" (??1_WSAINIT@@QAE@XZ) 中被引用
后来发现,在stdafx.h文件中添加如下语句就OK了
#include
#prama comment(lib, "ws2_32.lib")
就OK了。
结构如下:
但是ws2_32.lib已经在原有项目中包含了。为什么还要再包含一次呢。
初步解释:
静态库只是把自己工程的文件编译成.obj文件,再将.obj文件整合成静态库,其中并没有包含ws2_32.lib.所有要
在AppProject中包含ws2_32.lib.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
无法解析的外部符号的几种可能(lib方面的)(还有dll方面的,不在本文中)
无法解析的外部符号的几种可能
1. lib 文件未引入。可使用“#pragma comment(lib, “winsock.lib”) ”语句添加 lib 引用,也可在项目依赖里添加。
2. 类方法的实现未加类标识。如, “CTest::Connect(void) { … }” 写成了 “Connect(void) { … }”。
3. 缺少 obj 文件。在项目里添加“包含路径”:C:/curl/lib/release-dll/*.obj。
4. 没有将项目需要的头文件、源文件都加入项目中,这个错误我犯了好几次。
另外的一些解析:
当用Visual Studio 链接程序时,往往会产生”无法解析的外部符号“这一种错误,但是我们只能看到错误产生的位置是因为使用了某一个外部函数,我们暂且称之为问题函数,所有使用这个问题函数的函数都会产生类似的错误难到是文件包含问题吗?不是,即使include 了包含有这个问题函数的头文件,错误依旧。开始抓头皮了吧!先别急,仔细想一想问题所在。记得在手工敲命令行编译汇编程序的时候,命令常常是一下这种情况:(一个很常见的编译命令,假设这里用到了kernel32.lib ml /c /coff sample.asm link /subsystem:windows /entry:start /out:sample.exe sample.obj kernel32.lib 注意到后面的.lib文件,这就是问题的所在,我们如果用到了外部函数,即使源程序中已经写明了包含kernel32.lib,也要在链接的时候写入链接程序。 Visual Studio的链接程序默认写入了很多常用到的库文件,但是也难免有一些我们用的的没有加入,所以解决办法就是在编译选项中加入问题函数所在的lib文件即可。在哪里加入呢?要么回到原始时代,用命令行编译,要么点击工程中的项目属性,里面有一大堆的选项,挨个试试看要比我告诉你在哪里加入什么长的经验多错误产生的原因是再补上一小段:原来产生这个错误的原因不只是因为这一个比如写程序的风格是在一个独立的头文件中写明类的定义,函数声明,而且另一个源文件(cpp)中写类成员函数的实现,和已声明函数的实现,如果因为一点小小的拼写错误导致两者有点不一致,这种情况下,编译器就不能识别了-当然编译器也不好意思报错,我们已经把函数声明了呀!问题产生的原理是一样的,还是编译器找不到函数的实现部分--》废话,不然怎么会产生同样的错误呢!
http://www.cnblogs.com/lihaozy/archive/2012/07/04/2576679.html