问题说明:
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了。

解决方案 »

  1.   

    MMIDICT_INPUTWORD_WIN_TAB 
    定义在哪的如果是在dll里面定义的,那么要把这个dll的相关的lib加进取,包含进你工程
      

  2.   

    在MMI工程的mmi_dict.c中定义了MMIDICT_INPUTWORD_WIN_TAB-----------------看上面的程序
    #define     MMIDICT_WORD_LISTBOX_BOTTOM          199后面引用这些
    WINDOW_TABLE( MMIDICT_INPUTWORD_WIN_TAB ) =  //就在这里呀
    {
        CLEAR_LCD,
    ------------------
      

  3.   

    附加问题:
    lib库生成时 没有链接操作吗?是不是宏定义和引用宏的定义的变量在 该文件修改了以后会对整个工程的预编译产生影响呢?
      

  4.   

    因为宏定义是编译时确定的,当你的 mmi.lib 生成之后,由于 mmi.lib 是静态库,所以里面使用 MMIDICT_INPUTWORD_WIN_TAB 的地方都已经被硬编码成了固定的值或代码。后来你又修改了头文件中的这个宏定义,如果你不重建 mmi.lib 的话,那么你在 mmi.lib 之外的程序中是用的 MMIDICT_INPUTWORD_WIN_TAB 的实际值或代码就与 mmi.lib 的不同了,产生了二义性,所以编译器不会允许你这样做的,你必须重建 mmi.lib 来保持一致性。或者你也可以将这个宏改为全局变量,让它的值在运行时确定而不是在编译时确定,因该就可以避免重建 mmi.lib 了。
      

  5.   

    MMIDICT_INPUTWORD_WIN_TAB 其是不是宏,只是用宏定义的变量。
      

  6.   

    说明:#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应该不算是宏吧?而是使用宏而已
      

  7.   

    MMIDICT_INPUTWORD_WIN_TAB 自身是如何定义的?是用 #define 来定义的吗?如果是,就是宏。