【问题标题】:Function declarations and an unresolved external函数声明和未解析的外部
【发布时间】:2010-12-02 22:10:16
【问题描述】:

我正在处理一个巨大的旧 C 程序并将其转换为 C++(我是新手)。

由于程序必须在许多不同的平台上以许多不同的配置运行。

在一个文件中(称为file1.c)我正在调用 functionA()
在另一个文件中(称为file2.c)我有一个functionA()定义

不幸的是,函数的确切类型是由一组以令人眼花缭乱的方式创建的宏指定的。

现在链接器抱怨:

functionA 是一个未解析的外部符号。

我怀疑问题在于file1.c中看到的原型与file2.c中看到的函数的真实定义略有不同。

由于_cdeclfastcall 之间的不匹配,以及有和没有__forceinline 之间的不匹配,存在很大的细微差异。

有什么方法可以准确地显示编译器认为functionA() 的类型是file1.c 而不是file2.c

【问题讨论】:

    标签: c++ visual-studio-2008 linker c-preprocessor porting


    【解决方案1】:

    您可以将一个标志传递给编译器(我认为是 /P),使其输出传递给编译器的完整预处理输出 - 然后您可以打开这个(巨大的)文件,并通过它和您需要的信息就在那里,某处。

    【讨论】:

    • +1。谢谢...这有点帮助,尽管它现在揭示了一个更深层次的谜团,我已经提出了一个新问题。
    【解决方案2】:

    您是否必须将所有现有的 C 代码实际转换为 C++?这可能需要大量工作,尤其是考虑到您目前所描述的内容。

    相反,您可以使用 C++ 编写新代码并使用 extern "C" 调用 C 代码。例如,在 C++ 源文件中,您可以:

    extern "C" {
    #include "old_c_header.h"
    }
    

    这会更改链接,因此 C++ 编译器会生成对 C 代码的外部引用,而无需进行名称修改,从而允许链接器匹配所有内容。

    【讨论】:

    • 不幸的是,出于多种原因,我必须将其转换为 C++,但无论如何感谢您的提示。
    【解决方案3】:

    通常您应该在输出中包含预期和实际的签名。

    否则,您可以指示编译器将预处理结果输出到单独的文件中,cl.exe /p 用于 MSVC 和 gcc gcc -E

    【讨论】:

    • 链接器报告了它找不到的函数的精确声明,大概是file1.c对应的那个,但我不知道file2.c对应的那个。跨度>
    • 太糟糕了,我希望预处理器输出和 grep/搜索函数名有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2019-09-03
    • 2021-11-30
    • 1970-01-01
    • 2023-04-06
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多