Dll链接不一致

来源:互联网 发布:文科恋曲知乎 编辑:程序博客网 时间:2024/06/10 03:07

方法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 (这是我需要忽略的,你可以根据你工程的实际情况选择。)

原创粉丝点击