当符号明确存在于我链接的静态库中时,为什么会出现链接错误?

时间:2015-12-26 09:17:50

标签: c++ visual-c++ linker icu

我决定在我的项目中开始使用ICU,但遗憾的是VS2015正式不受支持(即开发人员将不兼容性列为known issue)。幸运的是,有人善于解决问题并与世界分享二进制文件: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编译时,由于某种原因我得到链接错误(有六个类似的,为简洁而省略):

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 )

我的链接器输入如下: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;。链接器可以清楚地打开所有文件,因为没有出现“无法打开文件”错误。

由于符号显然存在于库中,如dumpbin所示,为什么lib.exe在查找时遇到问题?

2 个答案:

答案 0 :(得分:2)

编译代码时需要定义U_STATIC_IMPLEMENTATION,以便ICU功能不被标记为导入。

(您可以看到它当前尝试查找的功能标记为__declspec(dllimport),它与静态库中的功能不匹配。)

答案 1 :(得分:0)

我建议尝试更改项目中运行时的链接模式(静态或动态)。 您可以在“设置”中找到此设置 - &gt; C / C ++ - &gt;代码生成 - &gt;运行时库(从/ MT - &gt; / MD更改,反之亦然)。 希望这会有所帮助。