从 dll 生成库 -执行>错误

Generate lib from dll -> error on exec

本文关键字:gt 错误 执行 dll      更新时间:2023-10-16

我正在尝试使用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文件的摘录:

库NSLDAP3V50.dll
出口
ldap_放弃@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@12TestLdapSun.exe:致命错误LNK1120:1个未解析的外部

问题是,链接器搜索_ldap_set_option@12但是lib具有_ldap_set选项。为了修复这个错误,我修改了.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文件,但没有这个链接器就无法链接。

知道吗?

谢谢;)

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

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