Windows C++ __imp 构建时引用错误

Windows C++ __imp reference error when building

环境:

我正在构建一个使用 LDAP 查询 Active Directory 的 C++ 程序(类似于此 MSDN page)。我从程序中得到以下代码示例:

#include<iostream>
#include<windows.h>
#include<winldap.h>

using namespace std;

int main() {

    string ldapServerUrl = "192.168.10.29";
    int ldapServerPort = 389;

    LDAP* ldapSession = ldap_init(&ldapServerUrl[0], ldapServerPort);

    return 0;

}

当我尝试在 Eclipse 中使用 mingw 工具链构建此示例时,构建失败并且带有 ldap_init() 的行带有红色下划线。当我将鼠标悬停在错误上时,它显示 "Undefined reference to _imp__ldap_initA()." 当我使用 cygwin 工具链尝试它时,它会产生类似的错误(下划线排列略有不同)。

当我尝试通过 cmd 编译时(cd 到目录然后 g++ main.cpp,cygwin 在 PATH 中),我得到这个错误:

/cygdrive/c/Users/SomeUser/AppData/Local/Temp/ccZczWy3.o:main.cpp:(.text+0x68):
undefined reference to `__imp_ldap_init'
/cygdrive/c/Users/SomeUser/AppData/Local/Temp/ccZczWy3.o:main.cpp:(.text+0x68):
relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp_ldap_init'
collect2: error: ld returned 1 exit status

我读过一些关于 __imp_ 前缀与链接相关的内容(这东西有点让我头疼,通常我是 Android 开发人员)。我遇到的一个术语是 declspec。我看了一下 winldap.h,它有以下(相关的?)代码:

#ifndef WINLDAPAPI
#define WINLDAPAPI DECLSPEC_IMPORT
#endif

但从那里开始,我不知道该去哪里。我如何编译它?

原来我没有安装Windows SDK。我要做的第一件事就是下载并安装它。

然后,在 Eclipse 中,我不得不对项目配置进行一些更改。

首先,我必须将 Windows SDK 添加到路径和符号包含目录(右键单击项目 -> 属性 -> C/C++ 常规 -> 路径和符号 -> GNU C++ -> 添加...)。就我而言,我必须添加的目录是 C:\Program Files (x86)\Windows Kits.1\Lib\winv6.3\um\x64.

接下来,我必须将 Windows LDAP 库添加到 Cygwin C++ 链接器库配置(右键单击项目 -> 属性 -> C/C++ 构建 -> 设置 -> Cygwin C++ 链接器 -> 库)。在 "Libraries (-l)," 下添加 Wldap32.Lib (区分大小写!).

现在构建并运行!