Windows C++ __imp 构建时引用错误
Windows C++ __imp reference error when building
环境:
- Windows 服务器 2012 R2
- 日蚀月神
- cygwin
- MinGW
我正在构建一个使用 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 (区分大小写!).
现在构建并运行!
环境:
- Windows 服务器 2012 R2
- 日蚀月神
- cygwin
- MinGW
我正在构建一个使用 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 (区分大小写!).
现在构建并运行!