gpt4 book ai didi

c++ - Borland C++ 链接器错误 c 文件包含

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:41 26 4
gpt4 key购买 nike

我正在尝试使用 borland C++ Builder V5.5 构建一个 C++ 程序。一切正常,直到我试图调用 c 文件中定义的函数。编译器可以正常工作,但链接不起作用。链接器无法找到从 C++ 文件调用的函数。 .obj 文件已生成并且是项目 xml 文件的一部分。现在有人告诉我如何解决这个错误。为了确保没有副作用,我开始了一个新项目,只是在构造函数中调用 c 函数调用。项目结构如下所示:

Form1.h 定义构造函数并包含定义 c 函数的 header

Form1.cpp实现Constructor并调用c函数

test.h定义了一个void函数“void abc();”

test.c 包含 test.h 并实现了一个空函数“void abc() {}”

未解析的外部“abc()”引用自 ...unit1.obj

有人有想法吗??

这里是一些代码

#include <vcl.h>
#pragma hdrstop
#include "Multicopter_Model.h"
#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
abcdefg();
return;
}

_

#ifndef RTW_HEADER_Multicopter_Model_h_
#define RTW_HEADER_Multicopter_Model_h_

void abcdefg();

#endif */

_

#include "Multicopter_Model.h"
/* Model initialize function */
void abcdefg()
{

}

最佳答案

我对 Borland C++ 一无所知,但如果您在 C++ 代码中声明某些内容是作为 C 构建的,您通常需要将 extern "C"{ ... }围绕声明。因此,在这种情况下,您的 Multicopter_Model.h 文件会像这样说:

#ifndef RTW_HEADER_Multicopter_Model_h_
#define RTW_HEADER_Multicopter_Model_h_

#ifdef __cplusplus
extern "C" {
#endif

void abcdefg();

#ifdef __cplusplus
}
#endif

#endif

这样做的原因是,为了支持重载等特性,从 C++ 代码构建的目标文件应用了称为名称修改的东西,由此(例如)一个函数 foo 接受一个 int 并返回一个 int 实际上可能被称为类似 foo__Rint_Aint 的东西来编码该信息。 (注 1:实名修饰约定更加简洁和隐晦。注 2:理论上,除了名称修饰之外,可以通过其他方式实现相同的效果,但实际上每个人都会进行名称修饰。注 3:不同的编译器执行不同形式的名称修饰.) 所以当 C++ 编译器看到 abcdefg 的声明时没有神奇的注释来告诉它“这真的是 C,而不是 C++”,这个名字被破坏了,编译后的代码实际上期望找到一个函数称为(在我虚构的名称修改约定中)abcdefg_Rvoid_Anone 或其他名称。该函数不存在,因为构建 Form1.obj 的 C 编译器不执行 C++ 名称修改,因此链接器无法找到它要查找的内容。

链接器的错误消息中隐藏了一些线索。您会注意到它说找不到 abcdefg() 而不仅仅是 abcdefg。那是因为参数列表被编码到它要查找的名称中。链接器友好地报告了一个人类可读的名称版本,而不是它实际上正在寻找的任何被破坏的怪物。

关于c++ - Borland C++ 链接器错误 c 文件包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11029062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com