warning C4273: ****.dll链接不一致

2011/12/02 16:18
阅读数 5.1K

方法1: 选择项目->属性->预处理器->预处理定义, 增加:HYCOMMONWINAPI_EXPORTS

方法2:
就是在
#ifdef HYCOMMONWINAPI_EXPORTS
#define HYCOMMONWINAPI_API __declspec(dllexport)
#else
#define HYCOMMONWINAPI_API __declspec(dllimport)
#endif
前面增加 #define HYCOMMONWINAPI_EXPORTS
其实这两种方法都是增加定义

方法3:在你的dll cpp文件中把
#define HYCOMMONWINAPI_EXPORTS
加在#include <接口文件.h>
的前面

方法4:右击dll工程 -- 属性,打开属性页,展开:配置属性 -- C++ --预处理器,在预处理器定义的最后面填入:_AFXEXT,再次编译则搞掂。

以上方法逐一试下,不知道能不能帮到你。另外这种问题最好去CSDN社区去问比较好,百度上牛X的人比较少,我就经常去CSDN。

非常郁闷的是,这个问题在relaese dll时又会出现,而且,上面的第4种解决方式没有作用,其它的几种方式暂时不甚了解到底怎么操作,因为第3种方法按它的做,出错

--------------------------------------------------------------------------------------------------------

VS2003 IDE中常见问题【转】

VS2003 IDE 笔记

我在安装Microsoft Visual Studio.Net的时候,总是出现这样的提示:“安装程序检测到另一个程序要求计算机重新启动。必须重新启动计算机后才能安装Visual Studio.Net系统必备。系统重新启动后,您需要重新启动安装程序。单击“确定”重新启动。单击“取消”退出安装程序,以后再安装。”然后我就单击“确定”重新启动电脑,待系统启动完毕后,重新启动安装程序,结果上述提示再次出现,又是重新启动电脑,然而还是这样的提示,无法安装。请高手指点。 
我的操作系统是WINXP SP2的,请问到底是什么原因?
解决办法:在注册表删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\pendingfilerenameoperations 然后再装就可以!
项目:常规-》配置类型(.exe .dll .lib 生成文件 实用工具)
项目:system->子系统(windows console)
项目:C/C++-》预处理器-》与处理器定义(预定义一些宏,如:WIN32 _DEBUG _CONSOLE)
启用扩展指令集:
项目:C/C++-》代码生成(启用增强指令集 2003支持SSE SSE2)
2007-6-28
这几天vc2003的编译输出显示的中文都是乱码,搞得我真不爽。原来是上次做的控制台命令程序修改了控制台的代页码936(中文)=》437(西文)。
并且应用到所有的console窗口。
但为什么会影响到编译的输出就不得而知了。
2007-9-13
附加××目录
头文件目录: 项目:C/C++ 》常规 》附加包含目录
库文件目录: 项目:链接器 》常规 》附加库目录
设置输出目录:(和工作目录)
项目:配置属性 》链接器 》 导入库 (如:$(OutDir)/cgloverd.lib )
项目:配置属性 》常规 》输出目录 (如..\..\bin)
如果要更改输出exe的名称可以这样:
项目:配置属性 》链接器 》输出文件 (如:..\..\bin/文件名.exe)(即 输出目录/文件名)
这样你可以把所有共享的dll放在..\..\bin中,然后应用程序编译链接后自动放到..\..\bin中以实现共享dll
(另外 如果出现如下错误:无法启动调试.无法启动程序“。。。”,系统找不到指定文件,就是因为未设置输出文件,可以如上添加输出exe)
如果你要应用程序的目录为其所在的目录(即 输出目录),就要设置 
项目:配置属性 》调试 》工作目录 (值同于 输出目录(如:..\..\bin));
[比如加载资源,用到文件路径,也是基于工作目录的]
[这个可能在用 打开文件对话框有用,比如你设置 exe输出到..\..\bin,那么默认的工作目录就和 exe所目录不一样,那么你设置的 打开对话框的默认路径
在..\..\bin 下的exe 和 你刚编译链接即刻出现的exe 下是不一样的 ,所以你设置 工作目录 同 输出目录一样,工作目录设置对 你刚编译链接即刻出现的exe 的工作目录 产生了影响]
============================================================================
2007-10-8
设置pdb文件目录(程序数据库文件)
项目:配置属性 》链接器 》调试 > 生成程序数据库文件(如:$(IntDir)/$(ProjectName).pdb)其中 $(IntDir)为中间目录
============================================================================
2007-10-8
设置lib文件目录(导出库目录)
项目:配置属性 》链接器 》高级 >导入库 (如:lib\cglover.lib)
============================================================================
2007-9-18
DLL,出现warning:“。。。”dll 链接不一致
原因:项目:配置属性 》C/C++ 》命令行 中的所有选项有指定 /D "CGLOVER_EXPORTS"(这里环境自动指定的导出符号)
#ifdef LOVER_EXPORTS //这里出错 =》CGLOVER_EXPORTS
#define CG_EXPORT __declspec(dllexport)
#else
#define CG_EXPORT __declspec(dllimport)
#endif
2007-9-18
DLL, 出现链接错误:无法打开文件“clock.def”
原因:这里的错误是clock.def的路径错误,以致找不到。
解决: 项目:配置属性 》链接器 》 输入   》模块定义文件:路径/cglover.def
也可以 项目:配置属性 》链接器 》 命令行 》在附加选项中添加: /DEF: "路径/clock.def"

2007-9-20
使用tinyxml.lib出现了与 一些 Runtime-lib 重定义的链接错误
原因:我想可能是 tinyxml不支持 多线程。
解决:项目:配置属性 》C/C++ 》代码生成运行时库 改为 单线程(/ML).
也可以采用 忽略指定库(这里为多线程的库):
项目:配置属性 》链接器 》输入》忽略指定库 (如:msvcrt.lib(多线程DLL)
2007-9-20
当使用模块定义文件(.def)时,
我们会在.def中写:( LIBRARY 导出的dll名)
但由于在一个dll中只允许一个.def文件,所以我们这时无法区别对待 Debug和Release版DLL,因为这是导出的.lib文件中填写的是.def指定的DLL名,
比如(MyD.lib 和 My.lib 中认定的都是.def定义的(My.lib),虽然我们能导出MyD.dll和My.dll.
解决:将 LIBRARY后面的去掉(有省事 有实惠,干吗还要写导出dll名呢)
==============================================================================================
2007-9-26
debug时出现链接错误:
libcpd.lib(xdebug.obj) : error LNK2019: 无法解析的外部符号 __malloc_dbg ,该符号在函数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" ( ??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) 中被引用
libcpd.lib(_tolower.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
libcpd.lib(xdebug.obj) : error LNK2019: 无法解析的外部符号 __free_dbg ,该符号在函数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" ( ??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) 中被引用
而且当使用<fstream>时才出现这个错误
另外使用Release时没错误。
经检查 项目 》 配置属性 》C/C++ 》 代码生成》运行时库 》
发现 Debug时使用的是:单线程(/ML) Release时使用的也是:单线程(/ML) 
将Debug的改为:单线程调式(/MLd)
好像是上次发现程序中使用的Tinyxml库不支持 多线程运行库 ,改为 单线程的运行库,但debug的没改为调试版本的
==============================================================================================
2007-9-26
输出dll后能够让你选择测试程序,若要改为不使用,如下:
项目:配置属性 》 调试 》 命令:中的 字符串 就指定了 测试程序 路径名文件名,去掉即可。
==============================================================================================
vc6->vc7的系列问题及解决方法-1 zz2006-07-19 09:57最近由于工作需要,把项目从vc6升级到vc7(vc.net2003)。升级过程遇到些问题,记录于此。
1. 编译时出现:WINVER not defined. Defaulting to 0X0501 (Windows XP and Windows .NET Server)
这个问题是因为没有指定工程要使用的平台SDK的版本。
Minimum system required Macros to define 
Windows Server 2003 family _WIN32_WINNT>=0X0502 
Windows XP _WIN32_WINNT>=0X0501 
Windows 2000 _WIN32_WINNT>=0X0500 
Windows NT 4.0 _WIN32_WINNT>=0X0400 
Windows Me _WIN32_WINDOWS=0X0490 
Windows 98 _WIN32_WINDOWS>=0X0410 
Internet Explorer 6.0 _WIN32_IE>=0X0600 
Internet Explorer 5.01, 5.5 _WIN32_IE>=0X0501 
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE>=0X0500 
Internet Explorer 4.01 _WIN32_IE>=0X0401 
Internet Explorer 4.0 _WIN32_IE>=0X0400 
Internet Explorer 3.0, 3.01, 3.02 _WIN32_IE>=0X0300
解决办法:
属性,C/C++,命令行,附加项中添加 /D _WIN32_WINNT=0x0501 (因为我是在xp下工作的所以是0x0501)

2. Link时出现:LINK : warning LNK4075: 忽略”/EDITANDCONTINUE”(由于”/INCREMENTAL:NO”规范)
这个问题是因为在vc6中,工程使用的增量编译。
解决办法:
属性,链接器,常规,启动增量链接 选择 是(INCREMENTAL)

3. 编译时出现:warning C4129: “U” : 不可识别的字符转义序列
error C3847: 通用字符中的错误符号;必须使用十六进制数字
原因:为开发全球通用的应用程序,.NET Framework 使用 Unicode UTF-16(Unicode 转换格式,16 位编码形式)来表示字符。在某些情况下,.NET Framework 在内部使用 UTF-8。引入通用字符名称的格式是 \u#### 或 \U########。
解决办法:
//#include MAKEPATH(MAIN_IMAGE_PATH, FunUtil\\Unit_star.txt)
#include “..\\ImageData\\ML128160\\FunUtil\\Unit_star.txt”

4. 链接时出现:LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit 已经在 MSVCRTD.lib(MSVCR71D.dll) 中定义 等类似错误
原因:
Run-Time Library
?Run-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。
我们一般使用的Run-Time Library是C Run-Time Libraries。当然也有Standard C++ libraries。 
CRun-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。 CRun-Time Libraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。?动态链接库版本:
/MD Multithreaded DLL 使用导入库MSVCRT.LIB
/MDd Debug Multithreaded DLL 使用导入库MSVCRTD.LIB?静态库版本:
/ML Single-Threaded 使用静态库LIBC.LIB
/MLd Debug Single-Threaded 使用静态库LIBCD.LIB
/MT Multithreaded 使用静态库LIBCMT.LIB
/MTd Debug Multithreaded 使用静态库LIBCMTD.LIB若要使用此运行时库 请忽略这些库 
单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 
多线程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 
使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 
调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 
调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 
使用 DLL 的调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
解决方法:
属性,链接器,输入,忽略指定库 libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib (这是我需要忽略的,你可以根据你工程的实际情况选择。)
展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部