我正在针对一些旧式第三方库构建应用程序,并且在链接阶段遇到问题。 我正在尝试使用Visual Studio 9进行编译。我的编译命令是:

cl -DNT40 -DPOMDLL -DCRTAPI1=_cdecl
-DCRTAPI2=cdecl -D_WIN32 -DWIN32 -DWIN32_LEAN_AND_MEAN -DWNT -DBYPASS_FLEX -D_INTEL=1 -DIPLIB=none -I. -I"D:\src\include" -I"C:\Program Files\Microsoft Visual Studio
9.0\VC\include" -c -nologo -EHsc -W1 -Ox -Oy- -MD mymain.c

代码可以干净地编译。 链接命令是:

link -debug -nologo -machine:IX86
-verbose:lib -subsystem:console mymain.obj wsock32.lib advapi32.lib
msvcrt.lib oldnames.lib kernel32.lib
winmm.lib [snip large list of
dependencies] D:\src\lib\app_main.obj
-out:mymain.exe

我得到的错误是:

app_main.obj : error LNK2019:
unresolved external symbol
"_\_declspec(dllimport) public: void
__thiscall std::locale::facet::_Register(void)"
(__imp_?_Register@facet@locale@std@@QAEXXZ)
referenced in function "class
std::ctype<char> const & __cdecl
std::use_facet<class std::ctype<char>
(class std::locale const &)" (??$use_facet@V?$ctype@D@std@@@std@@YAABV?$ctype@D@0@ABVlocale@0@@Z)

app_main.obj : error LNK2019:
unresolved external symbol
"__declspec(dllimport)  public: static
unsigned int __cdecl
std::ctype<char>::_Getcat(class
std::locale::facet const * *)"
(__imp_?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@@Z)
referenced in function "class
std::ctype<char> const & __cdecl
std::use_facet<class std::ctype<char>
(class std::locale const &)" (??$use_facet@V?$ctype@D@std@@@std@@YAABV?$ctype@D@0@ABVlocale@0@@Z)

app_main.obj : error LNK2019:
unresolved external symbol
"__declspec(dllimport)  public: static
unsigned int __cdecl
std::ctype<unsigned
short>::_Getcat(class
std::locale::facet const * *)"
(__imp_?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@@Z)
referenced in function "class
std::ctype<unsigned short> const &
__cdecl std::use_facet<class std::ctype<unsigned short> >(class
std::locale const &)"
(??$use_facet@V?$ctype@G@std@@@std@@YAABV?$ctype@G@0@ABVlocale@0@@Z)

mymain.exe : fatal error LNK1120: 3
unresolved externals

请注意,这些错误来自旧代码,而不是我的代码-app_main.obj是旧代码的一部分,而mymain.c是我的源代码。 我已经进行了一些搜索,我读到的内容表明,这种类型的错误是由于我的代码与要链接的库之间的-MD开关不匹配而引起的。 由于我要处理遗留代码,因此解决方案必须来自我的环境。 自完成C ++工作以来已经很长时间了,而自从使用Visual Studio以来已经更长了,所以我希望这只是我的一些无知。 关于如何解决这些问题的任何想法?

===============>>#1 票数:4

这些是标准库参考。 确保所有库(包括标准库)都使用相同的链接。 例如,在动态链接标准库时,您不能静态链接。 使用的线程模型也是如此。 请特别注意您和第三方库使用相同的链接选项。

这可能是* ss的真正痛苦。

===============>>#2 票数:2

MSDN上检查一下:

  • / MD使您的应用程序使用运行库的特定于多线程和DLL的版本。
  • / MT使您的应用程序使用运行库的多线程静态版本。

注意:“ ...,以便链接程序将使用LIBCMT.lib解析外部符号”

因此,您将需要一组不同的库。

我如何找出要链接的库:

  1. 查找一个确实链接的配置,然后添加/ verbose选项。
  2. 将输出通过管道传输到文本文件。
  3. 请尝试链接的配置。
  4. 在步骤2的详细输出中查找未解析的符号(在您的情况下为“ _declspec(dllimport)public:void thiscall std :: locale :: facet :: Register(void)”),然后找到使用的库。
  5. 将这些库添加到要链接的库列表中。

旧派但它的工作对我来说。

一月

===============>>#3 票数:2

如果您仍然希望使用VS2008(或将来)来编译项目,我建议您使用二进制编辑器来查看有问题的对象文件mainapp.obj

这是我的一个小项目的示例。

zdbException.obj包含以下摘录

DEFAULTLIB:"libc
pmtd" /DEFAULTLI
B:"uuid.lib" /DE
FAULTLIB:"uuid.l
ib" /include:?id
@?$num_put@DV?$o
streambuf_iterat
or@DU?$char_trai
ts@D@std@@@std@@
@std@@2V0locale@
2@A /include:?id
@?$numpunct@D@st
d@@2V0locale@2@A
 /DEFAULTLIB:"LI
BCMTD" /DEFAULTL
IB:"OLDNAMES" /E
DITANDCONTINUE 

注意条目/ DEFAULTLIB:“ LIBCMTD” 这表明目标文件是使用静态c运行时多线程调试编译的。

VS2008附带的标准运行时库中也有可能不推荐obj中引用的功能。

===============>>#4 票数:-2 已采纳

在尝试使这些东西在VS 2008下编译之后,我尝试了VS的早期版本-2005带有警告,而2003才起作用。 我仔细检查了链接,找不到任何问题,所以我只是找不到它,或者那不是问题。

因此,重申一下,降级到VS 2003已对其进行了修复。

  ask by Matt McMinn translate from so

未解决问题?本站智能推荐:

5回复

未解析的外部符号链接器错误(C ++)

我正在尝试为我的一个项目开发抽象设计模式代码,如下所示..但是,我无法编译代码..一些编译错误(如“未解析的外部符号”public:virtual void __thiscall Xsecs :: draw_lines (双,双)“(?draw_lines @ Xsecs @@ UAEXNN @
1回复

C ++链接器故障,带有我自己的代码的未解析的外部符号

我遇到了一个相当令人沮丧的链接器问题,这对我来说意义不大。 我有以下4个文件: 这将生成以下链接器错误: 我尝试将extern添加到标头中的声明中,检查以确保两个源文件都在同一目录中并进行编译,然后清理了构建。 但是似乎没有什么帮助。 鉴于同一个函数如何正常链接,而另一个函
1回复

链接C / C ++和Fortran,未解析的外部符号

我的Visual Studio 2010解决方案文件用于典型目的,包括一个fortran项目(静态库类型,由source1.f90组成),一个C / C ++项目(应用程序类型和包含main.cpp)和13个C / C ++项目(静态库类型,包含不同类的不同.cpp / .h文件)。 我的目的
1回复

模板宏的链接器错误:未解析的外部符号

我正在尝试在VS2010中构建其他人的代码。 它在VS2005中构建良好,但是我需要对其进行升级。 他们在标头中定义了如下宏: 我已经设法获取了现在要构建的代码,但是有关此宏的链接器错误很多: 使用的宏示例(在源文件中): 我对Boost和模板(对不起)都还很陌生
1回复

内联函数的链接器未解析的外部符号

我正在使用Visual Studio 2015开发C ++解决方案。 我有一个cpp源文件和带有此声明的头文件hpp。 标题: 和源代码: 我在一个类中使用此函数: 而且我在ConvertToOwnFormat::ReadCatalogue收到以下错误:
1回复

链接器错误2001未解析的外部符号

我之前从来没有遇到过这样的错误,请记住我还在上学,所以我没有这么久。 我得到的错误是: 错误1错误LNK2001:未解析的外部符号“private:static class std :: vector> Job :: names”(?names @ Job @@ 0V?$
3回复

链接器错误“未解析的外部符号”:使用模板

我有一个基于模板的类[Allotter.h和Allotter.cpp]: 它的用法显示为[ActiveListener.h和ActiveListener.cpp]: 我没有显示完整的定义,因为它并不重要。 问题是当我编译时,所有文件都正确编译。 这些文件位于VC ++项目中。
1回复

模板构造函数中的C ++链接器错误:“未解析的外部符号”

我正在尝试用C ++写一个模板类,并得到这个奇怪的链接器错误,并且无法找出原因,请让我知道这是怎么回事! 这是我在Visula C ++ 2010中收到的错误消息。 G ++中的错误消息 有2个.cpp文件和1个头文件,我在下面给出了它们。 仿真器 仿真器
3回复

未解析的外部符号C ++

我在下面的代码中遇到了问题: ProgrammSettings.h Settings.cpp 我做错了什么? 谢谢!
3回复

未解析的外部符号,C ++

我在尝试构建一个关于未解析的外部符号的项目时遇到错误,但是我无法找到问题所在,任何人都有任何想法? 谢谢 Tball.cpp Tball.h 错误: 我尝试过的任何东西似乎都对我有用。