error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter(转)
原文转自 https://www.cnblogs.com/xiongjiaji/archive/2010/12/31/2476565.html
今天用VS2005编译DirectShow程序,发现出来很多莫名其妙的链接错误:如下:
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter::FindPin(wchar_t const *,struct IPin * *)" (?FindPin@CBaseFilter@@UAGJPB_WPAPAUIPin@@@Z)
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter::JoinFilterGraph(struct IFilterGraph *,wchar_t const *)" (?JoinFilterGraph@CBaseFilter@@UAGJPAUIFilterGraph@@PB_W@Z)
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter::QueryVendorInfo(wchar_t * *)" (?QueryVendorInfo@CBaseFilter@@UAGJPAPA_W@Z)
上网一查,发现如下设置即可:
C/C++ | Language | Treat wchar_t as built-in type: yes?no?
默认为是,设置为否即可
在我的项目中正好相反,默认是 否,有上面的问题,改成是则编译成功。
(1) 为什么会出现这种错误呢?是因为VC6以及VS2003在wchar_t内置的选项上默认为No,而VS2005在此选项上默认为Yes,我今天使用VS2005打开原来VS2003建立的BaseClass项目,使得选项为No,这样编译出来的基类库的选项就是No了。
然后,在使用VS2005新建DirectShow程序时,默认选项为Yes,这样程序与基类的选项就不一致了,在函数的参数涉及到wchar_t时,程序的链接会由于生成的名字不同而导致链接不上(同样是wchar_t,链接时lib文件的符号是不同的)。
弄清楚这个问题之后,此选项的选择就无所谓了,只要工程和Lib在该选项上一致即可
(2) 通过查看定义CBasefilter类的头文件(amfilter.h)我发现其中关于构造函数的定义有如下代码
C/C++ code public: CBaseFilter( const TCHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid); // The clsid to be used to serialize this filter CBaseFilter( TCHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid, // The clsid to be used to serialize this filter HRESULT *phr); // General OLE return code #ifdef UNICODE CBaseFilter( const CHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid); // The clsid to be used to serialize this filter CBaseFilter( CHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid, // The clsid to be used to serialize this filter HRESULT *phr); // General OLE return code #endif
所以我想,vs默认编码就是unicode的,所以应该用的构造函数时下面两个,于是我把调用CBasefilter构造函数的地方改成
C/C++ code CBaseFilter("NetSender", lpunk, &mFilterLock, CLSID_NetSender)
原来是
C/C++ code CBaseFilter(NAME("NetSender"), lpunk, &mFilterLock, CLSID_NetSender)
其他的构造函数的调用也进行相应的改造,果然将这些link error都给kill掉了^_^
但是还有一处有问题就是关于CPosPassThru这个构造函数,这个类的构造函数没有定义unicode版本的,只有这样一个构造函数
C/C++ code CPosPassThru(const TCHAR *, LPUNKNOWN, HRESULT*, IPin *);
我去掉NAME宏以后出现如下错误
C/C++ code error C2664: 'CPosPassThru::CPosPassThru(const TCHAR *,LPUNKNOWN,HRESULT *,IPin *)' : cannot convert parameter 1 from 'const char [13]' to 'const TCHAR *'
我使用NAME宏的话,又出现连接错误
C/C++ code error LNK2028: unresolved token (0A00024D) "public: __thiscall CPosPassThru::CPosPassThru(unsigned short const *,struct IUnknown *,long *,struct IPin *)" (??0CPosPassThru@@$$FQAE@PBGPAUIUnknown@@PAJPAUIPin@@@Z)
也就是说,它认为我给它传入的第一个参数是一个unsigned short const char*类型
1,请问为什么我使用NAME宏,它会认为我使用的是unsigned short const char*类型,NAME宏不就是TEXT宏么,而TEXT宏不就是可以将常量字符创转换成TCHAR*么?
2,如何解决这个问题,我想也就是如何将unsigned short const char*转换成TCHAR*的问题。
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter(转)的更多相关文章
- main.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall CustomButton::metaObject(void)const " (?metaObject@CustomButton@@UBEPBUQMetaObject@@XZ)
QTCreator 运行时报错 main.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject cons ...
- vs2010+qt4编译出现error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject等错误
1.当vs2010编译qt时会出现以下错误: 1>------ 已启动全部重新生成: 项目: MyDialog, 配置: Debug Win32 ------ 1>生 ...
- 虚函数 error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl
在虚函数后面加一对大括号 #ifndef CAFFE_CONV_DW_LAYER_HPP_ #define CAFFE_CONV_DW_LAYER_HPP_ #include <vector&g ...
- error LNK2001: 无法解析的外部符号 "public: char * __thiscall
error LNK2001: 无法解析的外部符号 "public: char * __thiscall CamPinPadCtrl::KeysConvert(unsigned long,ch ...
- 无法解析的外部符号 "public: virtual struct CRuntimeClass * _
SetupPropertyPage.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct CRuntimeClass * __this ...
- C++工程编译之“error LNK2001: 无法解析的外部符号”
今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是 ...
- error LNK2001: 无法解析的外部符号
1.错误描述 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl PadSystem::Private::printQS ...
- error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7
工程使用了DirectDraw,编译出错 error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7 解决办法是吧dxguid.lib添加到工程中,把lib所在目录添加到工程 ...
- error LNK2019: 无法解析的外部符号 "public:
错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall test::test(void)" (??0test@@QAE@XZ),该符号在 ...
随机推荐
- strak组件(3):URL别名的优化
将生成URL别名的功能进行解耦.效果和上一节的一样. 效果图: 新增函数 get_url_name(self, param) # 生成url别名,需要一个参数(list/add/edit/delete ...
- 理解canvas路径
canvas路径和ps里面的路径差不多,在进行图形绘制时,先绘制出来图形的路径,然后再描边或者填充. canvas路径还有子路径的概念,在某一时刻,canvas之中只能有一条路径存在,Canvas规范 ...
- 笔记-scrapy-signal
笔记-scrapy-signal 1. scrapy singal 1.1. 信号机制 scrapy的信号机制主要由三个模块完成 signals.py 定义信号量 signalmana ...
- CSS计数器(自定义列表)
概念 CSS3计数器(CSS Counters)可以允许我们使用css对页面中的任意元素进行计数,实现类似于有序列表的功能(自定义有序列表) 与有序列表相比,它的突出特性在于可以对任意元素计数,同时实 ...
- css3心形 perspective transform
CSS3挺有趣的,能实现不少动画,以下为娱乐内容 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...
- Service Intent must be explicit
参考: http://blog.csdn.net/qs_csu/article/details/45114251 我做阿里云账号登录的时候,遇到一个问题,不知道阿里云服务的包名.怎么办?第二种方法可以 ...
- 将list中的元素按照属性分类成树状的map
技术交流群: 233513714 public LinkedHashMap<String, List<TPhoneModel>> queryPhoneList(List< ...
- csdn回到顶端
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JMeter学习笔记(六) 文件下载接口测试
本次测试的是文件下载接口,文件是PDF文档,步骤如下: 1.通过jmeter的录制功能,获取了文件下载接口的地址和参数,和其他的HTTP请求一样的配置 2.执行此接口后,察看结果树,点击下载接口的结果 ...
- Nodejs的那些事
前言: Node.js实际上是算是个前端开发,但是我们要做APP自动化涉及到 node.js ,也需要它来帮我们安装一些 packing 一.Node.js安装 1.安装Node.js:立即下载 2. ...