我维护一个旧项目并遇到一些链接器错误。
错误信息是:
error LNK2019: unresolved external symbol __imp__bsearch referenced in function "bool __cdecl is_sync_host
据我所知,bsearch
函数包含在头文件" cstdlib"或者" stdlib.h",但即使我包含标题,我也无法找到" bsearch"。
我怀疑这是因为这个旧项目由于符号冲突而忽略了一些lib(我也不知道为什么他们更喜欢省略lib而不是重命名函数)
忽略的库:msvcrt.lib;msvcrtd.lib;libcmt.lib;libc.lib
我尝试将那些被忽略的库添加回来,但后来遇到了很多"符号重新定义"问题,我不认为重命名这些功能是一个适用的解决方案。
我找到了解决办法(将bsearch
替换为std::binary_search
),但我想知道为什么以及如何正确解决这个问题(编译器怎样才能找到bsearch ?)。感谢。
答案 0 :(得分:1)
error LNK2019:
这是链接器错误。您的代码已编译就好(.c> .o),链接可以解决您的问题(.o> .exe)。
忽略的libs:“msvcrt.lib; msvcrtd.lib; libcmt.lib; libc.lib”
这意味着代码忽略了C标准库,所以难怪它找不到标准的bsearch()
函数......
问题是,为什么?对于编写良好的代码来说,没有理由(我能想到)明确忽略标准库。
我尝试将那些被忽略的库添加回来,但后来我遇到了很多“符号重新定义”的问题......
这让我得出的结论是,您的代码不“写得很好”,此时很难在不看代码的情况下提供建议,或者告诉您“放弃它”,这是废话“。 ; - )
我认为重命名这些功能并不适用。
如果项目中的函数名为,如标准库函数,除非您的项目 是标准库,否则它们的名称不正确且应该被重命名。
但是在这一点上,我会真的喜欢看到有问题的代码来弄清楚原始程序员可能会想到的......