项目中的链接错误问题(VC开发)

cxyol 2006-08-26 10:23:08
问题说明:
1.项目的工作区中有一个工程 MMI (很大有20W行左右的代码)它会生成一个mmi.lib库文件。
2.另外一个工程mskernel 会生成mskerne.dll文件,这个工程依赖 MMI 工程。而且一般保持固定。
我们是做二次开发的,要在MMI中加入一些自己需要的功能,于是,我在mmi_dict.c中做了如下的定义:
文件开始定义了需要的宏:
//define rect of word listox
#define MMIDICT_WORD_LISTBOX_LEFT 0
#define MMIDICT_WORD_LISTBOX_TOP 51
#define MMIDICT_WORD_LISTBOX_RIGHT 175
#define MMIDICT_WORD_LISTBOX_BOTTOM 199

后面引用这些
WINDOW_TABLE( MMIDICT_INPUTWORD_WIN_TAB ) =
{
CLEAR_LCD,
CREATE_LISTBOX_CTRL(MMIDICT_WORD_LISTBOX_LEFT,
MMIDICT_WORD_LISTBOX_TOP,
MMIDICT_WORD_LISTBOX_RIGHT, MMIDICT_WORD_LISTBOX_BOTTOM,
......
END_WIN
};
说明:#define WINDOW_TABLE(_WINTAB_) const uint32 _WINTAB_[]

在文件mmi_acc_main.c中使用了这个MMIDICT_INPUTWORD_WIN_TAB。
文件开始处:
#define WIN_DEF(_WINTAB_) extern const uint32 _WINTAB_[];
WIN_DEF(MMIDICT_INPUTWORD_WIN_TAB)

后面引用了这个MMIDICT_INPUTWORD_WIN_TAB:
MMK_CreateWin((uint32 *)MMIDICT_INPUTWORD_WIN_TAB,PNULL);

问题出来了:
大家知道VC的增量编译是很好用的,但是,只要我在mmi_dict.c编辑前面与宏定义有关的东西后,我“构建”MMI工程(应该是增量的)显示没有编译错误,但是我在生成依赖于该MMI工程的mskerne.dll时,在链接时却提示:
error LNK2001: unresolved external symbol _MMIDICT_INPUTWORD_WIN_TAB
./Bin/MSKernel.dll : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
然后,我有重新重建MMI工程(生成mmi.lib)后,生成mskerne.dll就没有问题了。
因为MMI重建需要很长时间(5-10分钟)所以,想问一下,为什么编辑了宏定义后,在链接时就找不到了这个_MMIDICT_INPUTWORD_WIN_TAB了。
...全文
202 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxyol 2006-08-28
  • 打赏
  • 举报
回复
一个百思不得其解的问题
ahzhuo 2006-08-27
  • 打赏
  • 举报
回复
MMIDICT_INPUTWORD_WIN_TAB 自身是如何定义的?是用 #define 来定义的吗?如果是,就是宏。
cxyol 2006-08-26
  • 打赏
  • 举报
回复
MMIDICT_INPUTWORD_WIN_TAB 其是不是宏,只是用宏定义的变量。
ahzhuo 2006-08-26
  • 打赏
  • 举报
回复
因为宏定义是编译时确定的,当你的 mmi.lib 生成之后,由于 mmi.lib 是静态库,所以里面使用 MMIDICT_INPUTWORD_WIN_TAB 的地方都已经被硬编码成了固定的值或代码。后来你又修改了头文件中的这个宏定义,如果你不重建 mmi.lib 的话,那么你在 mmi.lib 之外的程序中是用的 MMIDICT_INPUTWORD_WIN_TAB 的实际值或代码就与 mmi.lib 的不同了,产生了二义性,所以编译器不会允许你这样做的,你必须重建 mmi.lib 来保持一致性。或者你也可以将这个宏改为全局变量,让它的值在运行时确定而不是在编译时确定,因该就可以避免重建 mmi.lib 了。
cxyol 2006-08-26
  • 打赏
  • 举报
回复
附加问题:
lib库生成时 没有链接操作吗?

是不是宏定义和引用宏的定义的变量在 该文件修改了以后会对整个工程的预编译产生影响呢?
cxyol 2006-08-26
  • 打赏
  • 举报
回复
在MMI工程的mmi_dict.c中定义了MMIDICT_INPUTWORD_WIN_TAB

-----------------看上面的程序
#define MMIDICT_WORD_LISTBOX_BOTTOM 199

后面引用这些
WINDOW_TABLE( MMIDICT_INPUTWORD_WIN_TAB ) = //就在这里呀
{
CLEAR_LCD,
------------------
handsomerun 2006-08-26
  • 打赏
  • 举报
回复
MMIDICT_INPUTWORD_WIN_TAB
定义在哪的

如果是在dll里面定义的,那么要把这个dll的相关的lib加进取,包含进你工程
jun_01 2006-08-26
  • 打赏
  • 举报
回复
。。。帮不上你
cxyol 2006-08-26
  • 打赏
  • 举报
回复
很认真的请教这个问题!
cxyol 2006-08-26
  • 打赏
  • 举报
回复
说明:#define WINDOW_TABLE(_WINTAB_) const uint32 _WINTAB_[]
然后:
WINDOW_TABLE( MMIDICT_INPUTWORD_WIN_TAB ) =
{
CLEAR_LCD,
CREATE_LISTBOX_CTRL(MMIDICT_WORD_LISTBOX_LEFT,
MMIDICT_WORD_LISTBOX_TOP,
MMIDICT_WORD_LISTBOX_RIGHT, MMIDICT_WORD_LISTBOX_BOTTOM,
......
END_WIN
};

MMIDICT_INPUTWORD_WIN_TAB应该不算是宏吧?而是使用宏而已
ahzhuo 2006-08-26
  • 打赏
  • 举报
回复
什么是 “用宏定义的变量”?能否说清楚一点?

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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