从dll生成lib - >执行错误

时间:2014-10-30 14:01:35

标签: c++ dll linker

我尝试使用SUN LDAP C SDK(https://oss.oracle.com/projects/sun-ldapcsdk/)。 zip包括.h和.dll,而不是.lib,所以我需要生成.lib。 我使用dumpbin.exe,expdef.exe(http://purefractalsolutions.com/show.php?a=utils/expdef)和lib.exe为nsldap32v50.dll执行此操作。 def文件的摘录:

  

LIBRARY NSLDAP32V50.dll
  EXPORTS
      ldap_abandon @ 10
      ldap_add @ 11
      ldap_unbind @ 13
      ldap_compare @ 19
      ldap_delete @ 20
      ldap_result2error @ 21
      ldap_err2string @ 22
      ldap_modify @ 23
      ldap_modrdn @ 24
      ldap_open @ 25
      ldap_first_entry @ 26
      ldap_next_entry @ 27
      ldap_get_dn @ 30
      ldap_dn2ufn @ 31
      ldap_first_attribute @ 32
      ldap_next_attribute @ 33
      ldap_get_values @ 34
      ldap_get_values_len @ 35

要测试的代码很少:

#include <ldap.h>
int main(int argc, _TCHAR* argv[])
{
    LDAP        *ld;
    LDAPMessage *result, *e;
    BerElement  *ber;
    char        *a, *dn;
    char        **vals;
    int     i;
    int ldversion = LDAP_VERSION3;
    int debuglevel = 7;
    LDAPControl     **ctrls = NULL;

    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, &debuglevel);

    /* get a handle to an LDAP connection */


    std::cout << "Hellow World !" << std::endl;
    return 0;
}

在链接时我有一个错误:

  

TestLdapSun.obj:错误LNK2001:未解析的外部符号_ldap_set_option @ 12   TestLdapSun.exe:致命错误LNK1120:1个未解析的外部

问题是,链接器搜索_ldap_set_option @ 12但lib有_ldap_set_option。 要修复此错误,我修改.h文件:

之前:

#define LDAP_PASCAL __stdcall
#define LDAP_CALL LDAP_PASCAL
LDAP_API(int) LDAP_CALL ldap_set_option( LDAP *ld, int option, const void *optdata );

之后:

#define LDAP_PASCAL __cdecl
#define LDAP_CALL LDAP_PASCAL
LDAP_API(int) LDAP_CALL ldap_set_option( LDAP *ld, int option, const void *optdata );

好的,链接器现在没有任何警告。 启动.exe文件,确定但以错误结束

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function pointer declared with a different calling convention.

我认为这个错误来自我将__stdcall修改为__cdecl的.h文件,但没有这个链接器就无法链接。

有什么想法吗?

谢谢;)

1 个答案:

答案 0 :(得分:0)

导出定义文件没有条目ldap_set_option。因此,您的导入库没有用于解析链接器请求的符号。 .DEF文件中缺少符号的原因很可能是DLL没有导入它。

检查.MAP文件什么模块解析外部符号_ldap_set_option。查找正确的实现并使用它。