尝试将 openldap 移植到 Windows 时出现错误 LNK2019 无法解释
我正在使用 Visual Studio 2005 在 Windows XP 上工作。我的项目是在 Linux 上创建 LDAP 抽象 API 后创建的 Cmake 项目。我正在尝试以某种方式使其在 Windows 上运行。
我遇到了 LNK2019 类型的异常链接错误
main.obj:错误 LNK2019:符号外部非 résolu _strcpy référencé dans la 功能 _menu
碰巧该函数位于我的 main.c 中,并且上面的链接错误来自我的其他文件 LDAP.C,其中包含 load_values_from_attr()
/****/
static INT16 load_values_from_attr(t_LdapSearchContext ctx,
UINT32 result_max_count, LDAP *ld, LDAPMessage *result_message,
BerElement *ptr)
{
UINT16 j=0;
UINT16 i=0;
char *str_attr;
struct berval **str_values;
str_attr=ldap_first_attribute(ld, result_message, &ptr);
if (str_attr == NULL) return 1;
str_values=ldap_get_values_len(ld, result_message, str_attr);
strcpy(ctx.attributs[i].attrs, str_attr);
while(str_values[j]!=NULL && j+1<RESULT_WIDTH)
{
strncpy(ctx.attributs[i].values[j+1].val,
str_values[j]->bv_val,MAX_LENGTH);
#ifdef WIN32
ber_bvfree(str_values[j]); // <<< here is my problem
#endif
j++;
}
/****/
函数我删除或注释该行: ber_bvfree(str_values[j]);
发生链接错误,当我将其留在那里时,程序会编译并可以执行,但会出现段错误(这是另一个故事)。
我不明白为什么链接器会有这样的行为。
I'm working on Windows XP with Visual Studio 2005.My project is a Cmake project created after creating an LDAP abstraction API on Linux. I'm trying somehow to make it work on Windows.
I've got an unusual linking error of type LNK2019
main.obj : error LNK2019: symbole externe non résolu _strcpy référencé dans la fonction _menu
it happens that this function is in my main.c and the linking error above is coming from my other file LDAP.C which contain the load_values_from_attr() function
/****/
static INT16 load_values_from_attr(t_LdapSearchContext ctx,
UINT32 result_max_count, LDAP *ld, LDAPMessage *result_message,
BerElement *ptr)
{
UINT16 j=0;
UINT16 i=0;
char *str_attr;
struct berval **str_values;
str_attr=ldap_first_attribute(ld, result_message, &ptr);
if (str_attr == NULL) return 1;
str_values=ldap_get_values_len(ld, result_message, str_attr);
strcpy(ctx.attributs[i].attrs, str_attr);
while(str_values[j]!=NULL && j+1<RESULT_WIDTH)
{
strncpy(ctx.attributs[i].values[j+1].val,
str_values[j]->bv_val,MAX_LENGTH);
#ifdef WIN32
ber_bvfree(str_values[j]); // <<< here is my problem
#endif
j++;
}
/****/
When I delete or comment the line with: ber_bvfree(str_values[j]);
the Linking error happen, and when I leave it there, the program compiles and can be executed but segfault on it (which is another story).
I can't figure out why the linker is behaving this way.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
最后 !!在 Visual Studio 中研究链接器选项后,我认为有
/NODEFAULTLIB:msvcrtd.lib
enable ,破坏链接器的选项。没有它链接器可以正确链接不同的对象。
(在观察到我的代码中也存在 lnk2001 链接器问题后,已启用此选项)
注意:我仍然无法说出为什么此选项会在链接我自己的对象时遇到问题,通常 /NODEFAULTLIB:msvcrtd.lib 用于禁用默认库 msvcrtd.lib 包含。
我希望这能帮助某人
Finally !! after working on linker option in visual studio , i figure our that there was
/NODEFAULTLIB:msvcrtd.lib
enable , option that screwed the linker. without it linker can link correctly the different objects.
(this option ve been enable after observing there was lnk2001 linker problem in my code as well)
NB: I still can t tell why this option is involved in trouble linking my own object , usualy /NODEFAULTLIB:msvcrtd.lib is used to disable the default library msvcrtd.lib inclusion.
i hope this will help somebody