我尝试使用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文件,但没有这个链接器就无法链接。
有什么想法吗?
谢谢;)
答案 0 :(得分:0)
导出定义文件没有条目ldap_set_option
。因此,您的导入库没有用于解析链接器请求的符号。 .DEF文件中缺少符号的原因很可能是DLL没有导入它。
检查.MAP文件什么模块解析外部符号_ldap_set_option
。查找正确的实现并使用它。