一个不知道问题所在的链接错误

modena 2004-08-11 04:36:22
错误如下:(Rebuild All过也出相同的问题)
--------------------Configuration: Mdd - Win32 Debug--------------------
Compiling...
MddDatabase.cpp
Linking...
Creating library Debug/MddD.lib and object Debug/MddD.exp
MddDatabase.obj : error LNK2001: unresolved external symbol "int __stdcall lstrlenWInternal(unsigned short const *)" (?lstrlenWInternal@@YGHPBG@Z)
Debug/MddD.DLL : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

MddD.DLL - 2 error(s), 0 warning(s)
本程序会读写SQL数据库,并提供网络服务。
帮忙提示从何处入手查找原因?
...全文
215 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
modena 2004-08-14
回答2楼的问题:
lstrlenWInternal定义于DX90SDK\Samples\C++\DirectShow\BaseClasses\wxutil.h文件中
int WINAPI lstrlenWInternal( LPCWSTR lpString );

#ifndef UNICODE
#define wsprintfW wsprintfWInternal
#define lstrcpyW lstrcpyWInternal
#define lstrcpynW lstrcpynWInternal
#define lstrcmpW lstrcmpWInternal
#define lstrcmpiW lstrcmpiWInternal
#define lstrlenW lstrlenWInternal
#endif

而lstrlen定义为:
WINBASEAPI int WINAPI lstrlenA( IN LPCSTR lpString );
WINBASEAPI int WINAPI lstrlenW( IN LPCWSTR lpString );
#ifdef UNICODE
#define lstrlen lstrlenW
#else
#define lstrlen lstrlenA
#endif // !UNICODE

显然在使用DirectShow后DShow系统自定义了lstrlen并自己实现,当我需要使用DirectShow时产生了如上的现象,这也是为何同样的代码在新建的测试项目中不存在问题的原因。

解决的方法:
1.不使用DirectShow(呵呵,开玩笑)
2.Link with Quartz.lib / Strmbase.lib(其实只需要这个就可以了,不过建议其他两个一起链接) / Strmiids.lib
3.确保Windows.h在dshow.h之后include
回复
modena 2004-08-14
问题解决了,原因是此DLL用到的一个多媒体COM库中Link了Quartz.lib / Strmbase.lib / Strmiids.lib库,估计该库中对UNICODE定义有一定的限制,我在本应用中Link这些lib并Rebuild All,就可以了

谢谢各位的帮忙,晚上揭贴
回复
modena 2004-08-11
我新建一个ATL项目,使用该语句能够正确运行,因为不能舍弃ATL,所以还需要查出具体原因,各位有什么建议?
回复
modena 2004-08-11
pInfo的szName定义为
CHAR szName[MCLDB_MAX_VIRTUALNAME+1];

pVirtualDir的szName定义为
WCHAR szName[MCLDB_MAX_WVIRTUALNAME+1];
回复
modena 2004-08-11
出错地方找到:
strcpy( pInfo->szName, W2A(pVirtualDir[i].szName) );

但目前具体原因不明
回复
modena 2004-08-11
MddD.DLL不是连接数据库的DLL,他负责数据库管理和网络通信管理
回复
modena 2004-08-11
恩,我也看到了,我用到了大量的A2W,正在查找原因
回复
Kudeet 2004-08-11
MddD.DLL是那里来的,不是你连数据库的DLL吧?
回复
modena 2004-08-11
http://blog.joycode.com/jiangsheng/archive/2003/11/14/6631.aspx
回复
快乐鹦鹉 2004-08-11
http://blog.joycode.com/jiangsheng/archive/2003/11/14/6631.aspx
看看这个,蒋老大也碰到你这个问题
回复
modena 2004-08-11
我在GOOGLE上搜索都没有找到,估计不是这个问题
回复
快乐鹦鹉 2004-08-11
那得全世界搜索了。
回复
modena 2004-08-11
恩,这个就是编译MddD.DLL产生的错误,没有报缺少哪个LIB
回复
modena 2004-08-11
不知道需要Link With哪个LIB
回复
Kudeet 2004-08-11
lstrlenWInternal函数是不是你的MddD.DLL 文件里的,这样一般都是少了lib文件,是不是没有加MddD.DLL 的lib文件,#pragma comment(lib, "****.lib")
回复
modena 2004-08-11
呵呵,我也不知道啊,不是我调用的函数

我目前的分析是lstrlen函数的UNICODE版本
回复
a_melon 2004-08-11
所需的LIB文件没有加入连接选项
回复
快乐鹦鹉 2004-08-11
lstrlenWInternal这个函数哪里的?MSDN上没有。你从哪里弄来的?
回复
modena 2004-08-11
另程序中没有使用lstrlen等相关函数

程序中调用部分动态连接库均为非UNICODE版本
但连接数据库部分的DLL为支持UNICODE的COM组件,该组件经过全部测试可用
回复
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-11 04:36
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……