如何编译包含C++代码的C代码

How to compile C code that #includes C++ code?

本文关键字:代码 C++ 包含 何编译 编译      更新时间:2023-10-16

我必须编译生成的#include的C++头的C代码,它才能在Linux、OS X和Windows上工作。我自己放置了#include,以便能够与它中的C++代码进行交互。

然而,C代码是这样的,严格的编译器会捕获可能被视为警告的错误。我想把这些当作警告,因为大部分都是我无法控制的生成代码。

以下是我编译它的尝试(我使用CMake,顺便说一句):

(我使用这些标志:-Wno-write-strings -Wno-error -fpermissive

  • 将整个项目视为C++代码:在Linux上工作(使用g++),但在OS X上我得到:

Clang:

error: assigning to 'char *' from incompatible type 'const char *'

g++:

/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:18:no such instruction: `vmovdqa LC0(%rip), %xmm3'
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:19:no such instruction: `vmovdqa LC1(%rip), %xmm2'
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:20:no such instruction: `vmovdqu (%rsi), %xmm7'
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:21:no such instruction: `vmovdqu 16(%rsi), %xmm8'
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:22:no such instruction: `vmovdqa LC2(%rip), %xmm1'
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:23:no such instruction: `vpshufb %xmm3, %xmm7,%xmm6'
  • 将C代码视为C代码:

找不到<atomic>

 fatal error: atomic: No such file or directory
 #include <atomic>
  • 根据此答案使用-Wa -q标志:https://stackoverflow.com/a/19339870/3684931(我错了,应该是-Wa, -q

标志无效。

clang: error: unknown argument: '-q'
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
  • 根据此答案使用-Wa,-q标志:https://stackoverflow.com/a/19339870/3684931

标志仍然无效。

clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
clang: error: unsupported argument '-q' to option 'Wa,'

我该如何着手建造这个?

对我来说,你似乎在向后解决这个问题。每个一致的C++实现似乎都有一个兼容的C ABI,所以C++项目可以使用C库。利用这个优势。

  1. 创建包含C代码的C库,并将其编译为C代码(例如,cc -c your_filename.c将生成your_filename.o对象文件)
  2. 创建一个C++项目(如果您仔细设计的话,应该可以在其中包含所有的C头),并在编译该项目时使用链接器链接到步骤1中生成的your_filename.o对象文件

我把#包括我自己,以便能够从中与C++代码交互。

这就是你做错的地方。#include.c文件中提取C++标头将永远无法工作。

相反,您需要制作与C和C++都兼容的头文件。这些文件应该只包含C和C++的公共子集中的代码;它们还应该包含:

#ifdef __cplusplus
extern "C" { 
#endif
// main header code here
#ifdef __cpluscplus
}
#endif

使得包括该报头的C++单元使用C ABI来创建调用。

在这个头中,您可以声明一些函数,这些函数将与C文件所需的C++代码进行交互。您可以在编写的新C++源文件中实现这些函数。