VS2005 智能设备自制的DLL 编译成功后无法连接外部符号

wb175208 2011-08-01 10:08:44
制作过程:
VS2005->智能设备->Win32智能设备项目->平台->DLL

头文件:

#pragma once

#ifdef MYCLASS
#else
#define MYCLASS __declspec(dllimport)
#endif

class MYCLASS CMediaCtrl
{
public:
CMediaCtrl();
~CMediaCtrl();

void PreInit(HWND hVideoWnd,LPCTSTR strFileName);

....
};

CPP文件

#include "stdafx.h"
#include "MediaCtrl.h"

#include "EricCamera.h"
#include "Video.h"

CEricCamera m_Camera;
CVideoPlay m_Vedio;

#define MYCLASS __declspec(dllexport)

CMediaCtrl::CMediaCtrl()
{

}

CMediaCtrl::~CMediaCtrl()
{

}

void CMediaCtrl::PreInit(HWND hVideoWnd ,LPCTSTR strFileName)
{
.....
}
再生产Release版本后,在其他的只能设备应用程序中调用:
把DLL和LIB拷入相应的目录,
项目-》连接器-》输入-》附加依赖项-》MyDLL.lib

编译时没有问题。连接时出项一下问题:

1>LINK : warning LNK4232: 名称 导图V.exe 包含非 ASCII 字符,在具有除 936 以外的 ANSI 代码页的系统上可能不能加载 DLL
1>MediaTakePicture.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __cdecl CMediaCtrl::PreInit(struct HWND__ *,wchar_t const *)" (__imp_?PreInit@CMediaCtrl@@QAAXPAUHWND__@@PB_W@Z),该符号在函数 "public: virtual int __cdecl CMediaTakePicture::OnCreate(void)" (?OnCreate@CMediaTakePicture@@UAAHXZ) 中被引用
1>.\binvc\导图V.exe : fatal error LNK1120: 1 个无法解析的外部命令
...全文
240 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wb175208 2011-08-02
  • 打赏
  • 举报
回复
问题已经找到了
在编译DLL是将项目-》C\C++-》语言-》将wchar_t视为内置类型:否(/Zc:wchar_t-),如果不设置为否 DLL就编译不过去的,出现很多编译错误
而在实际项目中这项的内容为 是,所以才会出现连接错误!

这样的情况如何解决呢?希望各位大牛帮忙给看看
当我遇上-你 2011-08-02
  • 打赏
  • 举报
回复
还没解决?如果可以,把代码发我邮箱看看吧,28733690@163.com
wb175208 2011-08-02
  • 打赏
  • 举报
回复
再顶一下!!!!
当我遇上-你 2011-08-02
  • 打赏
  • 举报
回复
应该不是他的问题,
参考下http://blog.sina.com.cn/s/blog_51890fea0100l41h.html
wb175208 2011-08-01
  • 打赏
  • 举报
回复
我已经改过来了

#ifdef MYCLASS_EXPORTS
#define MYCLASS __declspec(dllexport)
#else
#define MYCLASS __declspec(dllimport)
#endif

class MYCLASS CMediaCtrl
呵呵呵,谢谢NorthCan
wb175208 2011-08-01
  • 打赏
  • 举报
回复
刚才用exescope看了一下,里面有函数对应的导出符号!就是链接不上,不知道为什么???
northcan 2011-08-01
  • 打赏
  • 举报
回复
#ifdef MYCLASS_EXPORTS
#define MYCLASS_EXPORTS __declspec(dllexport)
#else
#define MYCLASS_EXPORTS __declspec(dllimport)
#endif


class MYCLASS CMediaCtrl

这都没对应上,肯定导不出正确的接口的。
为什么不用def模块定义文件呢。。。。
程序比这个看起来简洁又容易使用。
还防止了导出符号因调用约定的问题被篡改。
Ei 2011-08-01
  • 打赏
  • 举报
回复
不好意思 ,前面复制错了。。。汗一个。。是这样
#ifdef MYCLASS_EXPORTS
#define MYCLASS __declspec(dllexport)
#else
#define MYCLASS __declspec(dllimport)
#endif
wb175208 2011-08-01
  • 打赏
  • 举报
回复
再顶一下!!!
wb175208 2011-08-01
  • 打赏
  • 举报
回复
改过之后的头文件:
#pragma once

#ifdef MYCLASS_EXPORTS
#define MYCLASS_EXPORTS __declspec(dllexport)
#else
#define MYCLASS_EXPORTS __declspec(dllimport)
#endif


class MYCLASS CMediaCtrl
{
public:
CMediaCtrl();
~CMediaCtrl();

void PreInit(HWND hVideoWnd,LPCTSTR strFileName);

....
};

然后在 项目-》C\C++-》预处理器-》MYCLASS_EXPORTS
然后重新编译之后,再次引入到工程中

头文件直接拷贝过来,没有添加宏定义
结果还是以上错误
1>LINK : warning LNK4232: 名称 导图V.exe 包含非 ASCII 字符,在具有除 936 以外的 ANSI 代码页的系统上可能不能加载 DLL
1>MediaTakePicture.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __cdecl CMediaCtrl::PreInit(struct HWND__ *,wchar_t const *)" (__imp_?PreInit@CMediaCtrl@@QAAXPAUHWND__@@PB_W@Z),该符号在函数 "public: virtual int __cdecl CMediaTakePicture::OnCreate(void)" (?OnCreate@CMediaTakePicture@@UAAHXZ) 中被引用
1>.\binvc\导图V.exe : fatal error LNK1120: 1 个无法解析的外部命令

郁闷的不行,不知道问题出在什么地方了???
当我遇上-你 2011-08-01
  • 打赏
  • 举报
回复
LS都说了,没有导出函数
wb175208 2011-08-01
  • 打赏
  • 举报
回复
谢谢各位,我先试试在把结果通知出来!
Ei 2011-08-01
  • 打赏
  • 举报
回复
楼主可以这样定义。。。在你的LIB工程属性页定义 MYCLASS_EXPORTS宏,这样的话你编译LIB的时候 会声明导出函数,而其他工程引用这个LIB头文件的时候,会声明导入函数

#ifdef MYCLASS_EXPORTS
#define MYCLASS_EXPORTS __declspec(dllexport)
#else
#define MYCLASS_EXPORTS __declspec(dllimport)
#endif
northcan 2011-08-01
  • 打赏
  • 举报
回复
用exescope看下你生成的dll有没有正确导出函数接口。
northcan 2011-08-01
  • 打赏
  • 举报
回复
看下MyDLL.lib里面正确导出了接口没有。
#define MYCLASS __declspec(dllimport)
#endif
class MYCLASS CMediaCtrl
这块应该是dllexport,才是导出吧。
其实导出接口,最简单清洁的做法是给DLL项目添加一个.def文件。在.def文件中导出接口
如:

LIBRARY "XXX"
EXPORTS
Barcode1D_init
Barcode1D_scan
Barcode1D_free

wb175208 2011-08-01
  • 打赏
  • 举报
回复
自己顶一下,请各位大侠帮帮忙!
wb175208 2011-08-01
  • 打赏
  • 举报
回复
自己顶一下,问题还是没有解决呢!郁闷中。。。
wb175208 2011-08-01
  • 打赏
  • 举报
回复
是的,他们在同一个目录下呢!是不是需要 extern "C"编译呢?
Ei 2011-08-01
  • 打赏
  • 举报
回复
MyDLL.lib和MyDLL.dll在同一个目录下吗?
wb175208 2011-08-01
  • 打赏
  • 举报
回复
编译的是MyDLL.lib和MyDLL.dll 链接的是MyDLL.lib,这个没有问题,AAa_tnT你好,你所说的链接多次值的是什么?
加载更多回复(1)
作者写点废话哈: 1、先是看到手机上有个小游戏,填字游戏,横竖相连,像个迷宫 2、就用Delphi 做了个由 panel 数组 组成的迷宫,墙都是方块,丑死了。 3、再查查网上有不少迷宫样式,其中有的迷宫是单墙的,而且任意两处都是想通的。 4、再做了个四面墙都可打通的迷宫,甚至做了个斜线通道的。 5、觉得三角形迷宫更有挑战性,另外想试试以前学的数据结构指针、链表、树、连通图的知识是不是忘光了, 就做了个三角形迷宫,而且索性做成一个完善的 Delphi 控件,而且有不少属性。。。 6、有几个要解释下:1)迷宫是个连通图,每个正三角形与三个倒三角形相连,每个倒三角形与三个正三角形相连; 2)采用递归,从一个节点开始构造整个连通图;3)查找、遍历连通图时用外部二维数组标识来防止重复; 3)构造迷宫采用的是所谓 随机prim 算法;4)迷宫的宽与三角形边长、列数相互制约,迷宫的高由三角形的高 (正三角形的高通过边长计算的)与行数决定;5)使用指针时最容易丢掉 ^ 这个符号,例如某节点是 Pmm 指针型, 对其属性的引用就不能用 Pmm.Value 而必须用 Pmm^.Value ,机器编译时不会提示错误,但运行时老是出错! 6)绘图通过计算三角形的顶点坐标来构造;7)控件父类是 TGraphicControl ,试了好几种最后它最好, 要覆盖 paint 方法绘图;8)构造类时如 FGridWidth 的内部数据与属性 GridWidth 不要混淆使用, 记住 内部数据赋值,属性引用,属性(Published)是给运行期或者设计面板上别人使用的,内部数据是封装的; 9)发布自定义控件前先准备一个包含 类 一样名称的 ICO 的 DCR 文件,好像只有 Delphi7 里的 Image Editor 可以制作,这个工具包括两个文件 ImageEdit.exe 和 ImageD32.dll 两个文件 7、好像前后陆续花了近两个星期吧,终于基本完善了。该学点其他东西了 -- by chenxz

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧