未解析的外部符号:符号名称末尾的@ 12 vs @ 8

时间:2010-09-21 15:48:47

标签: c++ linker lnk2019

我对C ++没有任何重要经验,但最近不得不参与C ++部分的项目(实际上是apache模块)。

现在我正在尝试构建一些现有的非常遗留的代码,并且当VC ++链接器在apache库中找不到一个特定的函数时会面临非常奇怪的问题(同时看到其余部分)

代码是这样的(取自专门为解决此问题而构建的简单示例):

ap_rputs(ap_gm_timestr_822(r->pool, time(NULL)), r);

(这应该只打印当前日期,但实际上并不重要)

我得到的错误是这样的:

error LNK2019: unresolved external symbol _ap_gm_timestr_822@12 referenced in function _hello_handler

现在到了奇怪的部分:这个函数实际上存在于我链接的库中,但它的符号名称是 _ap_gm_timestr_822 @ 8 (不是 @ 12 ,但是 @ 8 最后)。

我尝试使用MSVC ++中几乎所有可能的编译器/链接器属性 - 不幸的是,没有效果。

这个问题可能与这样一个事实有关吗:库(它是apache 1.3发行版的一部分)是用不同的/旧的...编译器构建的,而不是我使用的?我目前正在使用MS VC ++ Express 2008.如果是这种情况,有没有人知道如何解决这个问题呢?

3 个答案:

答案 0 :(得分:3)

time_t typedef有两种版本,传统的32位将产生Y2K38问题,64位是该问题的解决方案。你在这里不匹配。

检查您使用的CRT的time.h头文件,其中应该有一个#ifdef,用于在旧版本和64位版本之间进行选择。如果你仍然期望在2038年之前成为一名程序员,那就避免使用遗产。

答案 1 :(得分:3)

在Visual Studio中,@ suffix表示参数的总字节大小。它在两个函数之间不同的事实意味着签名不匹配。最有可能的是,考虑到大小差异,您尝试从64位链接到32位函数。

答案 2 :(得分:0)

这些组成名称是函数的名称以及参数类型的详细信息。

因此,您所包含的头文件声明函数的参数与您链接的lib不匹配。

当编译器命令行中出现“-define”错误时,我经常遇到这种情况,因此在头文件中选择与您要链接的lib不匹配的选项。通常这是选择所需的“线程”,或者如果你想要Unicode。

因此请检查编译器命令行是否与链接器命令行正确匹配。