如何编译#includes C ++代码的C代码?

时间:2015-06-29 19:21:13

标签: c++ c compilation compiler-errors compiler-warnings

我必须编译生成的C代码#include的C ++头文件,它可以在Linux,OS X和Windows上运行。我自己设置#include以便能够与C ++代码进行交互。

然而,C代码是这样的,严格的编译器会捕获可以被视为警告的错误。我希望将这些作为警告传递出来,因为大部分内容都是生成的代码,我无法控制。

以下是我尝试编译它(我使用CMake,btw):

(我使用这些标志:-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>

标记无效。

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

标志仍无效。

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

我该如何构建这个?

2 个答案:

答案 0 :(得分:1)

你似乎向我解决了这个问题。每个符合C ++的实现似乎都具有兼容的C ABI,因此C ++项目可以使用C库。使用它对您有利。

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

答案 1 :(得分:0)

  

我自己把#includes用来与C ++代码进行交互。

这是你出错的地方。 <{1}}来自#include文件的C ++标头永远不会有效。

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

.c

使包含此标头的C ++单元使用C ABI创建调用。

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