2

我对 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。如果是这种情况,有没有人知道可以做些什么来解决这个问题?

4

3 回答 3

3

time_t typedef 有两种类型,传统的 32 位将产生 Y2K38 问题和 64 位,该问题的解决方案。你这里有一个不匹配的地方。

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

于 2010-09-21T16:52:15.950 回答
3

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

于 2010-09-21T16:55:54.460 回答
0

这些组成名称是函数的名称与参数类型的详细信息相结合。

因此,您包含的头文件使用与您链接的库不匹配的参数声明了该函数。

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

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

于 2010-09-21T15:51:47.110 回答