2008-08-22 63 views
1

我正在构建针对一些传统的第三方库的应用程序,并且存在链接阶段的问题。我试图用Visual Studio 9进行编译。我的编译命令是:C++链接器无法解析的外部符号

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 

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

​​

是我得到的错误是:

app_main.obj : error LNK2019: 
unresolved external symbol 
"_\_declspec(dllimport) public: void 
__thiscall std::locale::facet::_Register(void)" 
([email protected]@[email protected]@@QAEXXZ) 
referenced in function "class 
std::ctype<char> const & __cdecl 
std::use_facet<class std::ctype<char> 
(class std::locale const &)" ([email protected][email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]@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 * *)" 
([email protected][email protected]@[email protected]@[email protected]@[email protected]@Z) 
referenced in function "class 
std::ctype<char> const & __cdecl 
std::use_facet<class std::ctype<char> 
(class std::locale const &)" ([email protected][email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]@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 * *)" 
([email protected][email protected]@[email protected]@[email protected]@[email protected]@Z) 
referenced in function "class 
std::ctype<unsigned short> const & 
__cdecl std::use_facet<class std::ctype<unsigned short> >(class 
std::locale const &)" 
([email protected][email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]@Z) 

mymain.exe : fatal error LNK1120: 3 
unresolved externals 

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

回答

-2

在试图在VS 2008下编译这些东西之后,我尝试了VS-2005的早期版本,并且在警告中工作,而2003只是工作。我仔细检查了链接,并且找不到任何问题,所以要么我找不到它,要么这不是问题。

因此要重申,降级到VS 2003将其固定。

5

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

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

2

入住这对MSDN

  • /MD使你的应用程序使用的运行时库的multithread-和具体的DLL版本。
  • /MT使您的应用程序使用运行时库的多线程静态版本。

注:“......使链接器将使用LIBCMT.LIB来解决外部符号”

所以你需要一个不同的组库。

如何我去约找出哪些库链接:

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

旧的skool,但它worked对我来说。

2

如果您仍然希望获得项目使用VS2008(或将来)我可以使用二进制编辑器来查看问题mainapp.obj目标文件建议编译。

这是一个来自我的一个小项目的例子。

的zdbException.obj包含以下摘录

DEFAULTLIB:"libc 
pmtd" /DEFAULTLI 
B:"uuid.lib" /DE 
FAULTLIB:"uuid.l 
ib" /include:?id 
@[email protected]?$o 
streambuf_iterat 
[email protected]?$char_trai 
[email protected]@[email protected]@@[email protected]@ 
@[email protected]@[email protected] 
[email protected] /include:?id 
@[email protected]@st 
[email protected]@[email protected]@A 
/DEFAULTLIB:"LI 
BCMTD" /DEFAULTL 
IB:"OLDNAMES" /E 
DITANDCONTINUE 

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

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