当我 link 反对的静态库中明确存在该符号时,为什么我会收到 link 错误?
Why do I get link errors when the symbol is clearly present in the static library I link against?
我决定在我的项目中开始使用 ICU,但遗憾的是 VS2015 不受官方支持(即开发人员将不兼容性列为 known issue). Luckily someone was kind enough to fix the problems on their own and share the binaries with the world: http://www.npcglib.org/~stathis/blog/precompiled-icu/。我已经下载了 ICU 56 VS15 包,我'我正在尝试编译以下简单程序:
#include <iostream>
#include <unicode\unistr.h>
int main()
{
auto myStr = icu::UnicodeString::fromUTF8(u8"кошка");
std::cout << "length: " << myStr.length() << std::endl;
std::getchar();
return 0;
}
当我使用编译时导入 .lib
库时,一切正常,但当然我在运行时需要 DLL 库。当我针对静态 sicuxxx.lib
进行编译时,出于某种原因我得到 link 错误(有六个类似的错误,为简洁起见省略):
Error LNK2001 unresolved external symbol "__declspec(dllimport) private: int __thiscall icu_56::UnicodeString::getShortLength(void)const " (__imp_?getShortLength@UnicodeString@icu_56@@ABEHXZ)
我做了 dumpbin /symbols sicuuc.lib
,在输出中我可以看到以下内容:
0E8 00000000 SECT47 notype () External | ?getShortLength@UnicodeString@icu_56@@ABEHXZ (private: int __thiscall icu_56::UnicodeString::getShortLength(void)const )
我的 linker 输入如下:kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;sicudt.lib;sicuin.lib;sicuio.lib;sicule.lib;siculx.lib;sicutest.lib;sicutu.lib;sicuuc.lib;
。 linker 可以清楚地打开所有文件,因为没有出现 "cannot open file" 错误。
由于 dumpbin 所显示的符号清楚地存在于库中,为什么 lib.exe 找不到它?
我建议尝试更改项目中运行时的链接模式(静态或动态)。
您将在 Settings -> C/C++ -> Code Generation -> Runtime Library 中找到此设置(从 /MT -> /MD 更改,反之亦然)。
希望这有帮助。
您需要在编译代码时定义 U_STATIC_IMPLEMENTATION
,这样 ICU 函数就不会被标记为导入。
(可以看到它当前要查找的函数标记为__declspec(dllimport)
,与静态库中的函数不匹配。)
我决定在我的项目中开始使用 ICU,但遗憾的是 VS2015 不受官方支持(即开发人员将不兼容性列为 known issue). Luckily someone was kind enough to fix the problems on their own and share the binaries with the world: http://www.npcglib.org/~stathis/blog/precompiled-icu/。我已经下载了 ICU 56 VS15 包,我'我正在尝试编译以下简单程序:
#include <iostream>
#include <unicode\unistr.h>
int main()
{
auto myStr = icu::UnicodeString::fromUTF8(u8"кошка");
std::cout << "length: " << myStr.length() << std::endl;
std::getchar();
return 0;
}
当我使用编译时导入 .lib
库时,一切正常,但当然我在运行时需要 DLL 库。当我针对静态 sicuxxx.lib
进行编译时,出于某种原因我得到 link 错误(有六个类似的错误,为简洁起见省略):
Error LNK2001 unresolved external symbol "__declspec(dllimport) private: int __thiscall icu_56::UnicodeString::getShortLength(void)const " (__imp_?getShortLength@UnicodeString@icu_56@@ABEHXZ)
我做了 dumpbin /symbols sicuuc.lib
,在输出中我可以看到以下内容:
0E8 00000000 SECT47 notype () External | ?getShortLength@UnicodeString@icu_56@@ABEHXZ (private: int __thiscall icu_56::UnicodeString::getShortLength(void)const )
我的 linker 输入如下:kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;sicudt.lib;sicuin.lib;sicuio.lib;sicule.lib;siculx.lib;sicutest.lib;sicutu.lib;sicuuc.lib;
。 linker 可以清楚地打开所有文件,因为没有出现 "cannot open file" 错误。
由于 dumpbin 所显示的符号清楚地存在于库中,为什么 lib.exe 找不到它?
我建议尝试更改项目中运行时的链接模式(静态或动态)。 您将在 Settings -> C/C++ -> Code Generation -> Runtime Library 中找到此设置(从 /MT -> /MD 更改,反之亦然)。 希望这有帮助。
您需要在编译代码时定义 U_STATIC_IMPLEMENTATION
,这样 ICU 函数就不会被标记为导入。
(可以看到它当前要查找的函数标记为__declspec(dllimport)
,与静态库中的函数不匹配。)