【问题标题】:Calling C code from C++ with using extern "C"使用 extern "C" 从 C++ 调用 C 代码
【发布时间】:2020-04-14 20:06:05
【问题描述】:

我有3个文件,一个c++文件main.cpp,一个c文件test.c和一个头文件test.h

我想尝试在 C++ 文件中使用 C 代码。出于同样的原因,我在 test.h 中声明了一个函数,并在 test.c 中定义了它,并在 main.cpp 中使用了它

main_temp.c 只是为了解释。

测试.h

void test(int);

test.c

#include <stdio.h>
void test(int a) {
  printf("%d", a);

main_temp.cpp

#include "test.h"
int main() {
  foo(5);
}

在这里,我明白为什么这行不通了。 C 符号将是简单的 'foo',但由于 C++ 在创建符号时做了更多的事情,它可能是 'void@test(int)' 并且为了解决这个名称修改问题,我必须将 C++ 符号视为 C 符号。所以,我会使用 extern "C" 并且我的 main.cpp 变成这样:

main.cpp

extern "C" {
  #include "test.h"
}
int main() {
  foo(5);
}

我不明白为什么这不起作用!我明白了:

main.cpp:(.text+0xa): undefined reference to `test`

有人可以分享这些见解吗?

【问题讨论】:

  • 你是否链接了 test.o,它是如何编译的?如果您使用的是构建系统,请显示您的命令行步骤,或者您的 MakefileCMakefile 等。
  • @aschepler,我刚刚做了:g++ main.cpp
  • 那你就少了test.c
  • 所以 test.c 甚至不是该程序的一部分,test 的定义确实丢失了。
  • @HemantBhargava 您不应该使用g++ 前端来编译C 文件。您需要使用gcc 编译test.c 和使用g++ 编译main.cpp,然后将它们链接在一起。

标签: c++


【解决方案1】:

我相信您将它们编译或链接在一起?否则那将是原因。在 gcc 上会是这样的:

g++ -c -o main.o main.cpp
gcc -c -o test.o test.c
g++ -o a.out main.o test.o

假设您没有编译/链接错误,请将 main.cpp 和 test.c 编译为目标文件并在两者上运行 nm。它将显示main.o 想要什么符号以及test.o 导出什么符号。那么为什么链接器不能完成它的工作应该很清楚了。

【讨论】:

  • 小写-c。 (如果您不想要不同的文件名或不同的输出目录,可以省略-o x.o;默认使用相同的文件名,将扩展名替换为.o
  • 我明白了。有没有什么办法宁愿只编译两个?为什么我们需要为 C 和 C++ 文件分别编译?为什么我不能只做:g++ main.cpp test.c?
  • g++ main.cpp test.c 会将 test.c 编译为 C++,而不是 C。
  • g++ 是 C++ 编译器的驱动程序,但您可以告诉它切换到不同的语言:g++ main.cpp -x c test.c-x 标志表示“命令行后面的文件使用这种特定语言”。
  • @MilesBudnek • 对于C,您应该使用C 编译器。对于 C++,您应该使用 C++ 编译器。如果您要混合使用 FORTRAN,则对于 FORTRAN,您应该使用 FORTRAN 编译器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多