用记事本打开lib,很清楚的看到一个函数,调用的时候却出现如下错误:
error LNK2001: unresolved external symbol "short __cdecl eda_get_pdb_name(char *,char *,short)" (?eda_get_pdb_name@@YAFPAD0F@Z)另外我找了个正常使用的lib文件,有意在link项中去掉它,提示的错误如下:
error LNK2001: unresolved external symbol _HdaEnumGetNode@16大家看到了,他们提示的错误有细微差别,不知道高手能否从这点差别看出我的问题所在!另外在lib文件中,他们也有细微差别:
可以正常使用的lib中函数的表达形式类似于:__imp__FixGetMyname@8
而无法使用的lib中的函数的表达形式类似于:__imp__DmacsEventLogClose前者有序号,后者没有!请问高手如何解决这个问题,非常急!注:不用mfc,在控制台程序下,那个无法使用的lib可以正常使用。

解决方案 »

  1.   

    编译器会隐含的改变符号的名字.比如C编译器会在生成OBJ文件时回在符号前加一个下划线.因此,函数Foo在OBJ中将变成公共符号_Foo.另一个例子是当你使用C++时,编译器会采用函数名和一些附加的参数信息.在Visual C++中,函数"void Foo(int i)"将变成  "?Foo@@YAXH@Z".这种重新命名叫做"名字粉碎机制"或者叫"装潢",可以让连接程序来区分重载函数(重载函数是一些用相同函数名,但是具有不同的参数列表的函数 .用这种方法,你就可以明白连接程序是怎么处理重载的C++函数了.)在连接阶段公共符号名称和外部名称必须完全匹配,并且编译器将改变符号的名字.当你碰到一个“unresolved external”的连接消息时,紧接着的行动很清楚了:在OBJ 或LIB文件中找到公共符号名,然后与连接器报告的外部符号名相比较.它们总是不同的,并且解决的方法就是得到匹配的符号名.另外,当你dumping COFF import库时,函数名前被加上 "__imp__"前缀 (比如 __imp__GetFocus@0).这是在函数定义时使用__declspec(dllimport)的副产品。以上是我从msdn上摘录并翻译的.具体的搜索方法是:
    在"搜索(S)"标签下,在"输入要查找的单词(W)"中输入:Under the Hood
    然后,"选择主题(T)"中,选择"级别"为 19 的文章.
    应该对你很有帮助!
      

  2.   

    project setting中的路径设对了吗?应该是没找到lib文件。
      

  3.   

    在头文件中找一下函数相关的lib文件
      

  4.   

    没找到lib在编译的时候就会出错,根本没有机会到连接那一步,你把我当傻瓜?
    我知道是命名命名的问题,我问是怎么解决这个问题!
      

  5.   

    oyljerry(☆勇敢的心☆) 
    看头文件只能得到函数的参数和返回值,这与找不到函数有什么关系啊!只要有函数名,给个错误的参数也能通过编译,只不过是运行时候出错罢了!
      

  6.   

    我强烈要求一个懂lib文件的人来回答!我受不了啦!
    error LNK2001: unresolved external symbol "short __cdecl eda_get_pdb_name(char *,char *,short)" (?eda_get_pdb_name@@YAFPAD0F@Z)
    是找不到函数的入口,与函数的参数有什么关系啊?参数不正确只会是运行的时候出错,与编译有什么关系啊?这是调用lib,不是调用cpp中的函数!现在是通不过连接!你们假设我的参数是正确的行不行啊!这么简单的问题也不相信我。
      

  7.   

    dll有两种导出方式,函数名导出和符号导出,但这两个在调用时候没有分别的.是否版本不一致.调用lib的其它处理函数是否也是这个错误.
      

  8.   

    有可能是这个lib是用C语言写的,如果在C++工程里用了C语言写的lib文件,就必需要这样包含:
    extern "C"
    {
        #include "myheader.h"
    }
    这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错。
      

  9.   

    我用的是静态连接。
    楼上说的问题我考虑过了,我一直感觉是编译的时候的问题,因为我在.c文件中使用就没有问题,而在.cpp中有问题,但一直不知道怎么解决它,我先试一试上面的程序再说。
      

  10.   

    问题解决了,正如holyeagle(一杯清茶) 所说,我用的那个lib文件是在c下编译的,在cpp下使用就会出问题,解决人办法就是holyeagle(一杯清茶) 所说,以前这方面没注意,其实我也知道到是c和cpp之间的名字约定问题,我在一楼也说的很清楚,可是苦于不知道如何解决,其实会者就一句话就行了!
      

  11.   

    典型的函数没有导出!
    有需要导出的函数前加上
    _declspec(dllexport)关键字,
    还要在VC里设置:
    project->setting->link->写上你的lib文件,
    另外还要把DLL的头文件加载上需要调用的工程上,把lib文件和DLL文件放在发布的目录一下(看你VC上面的如何设置不同而不同)
    over!