如何编译包含C++代码的C代码
How to compile C code that #includes C++ code?
我必须编译生成的#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库。利用这个优势。
- 创建包含C代码的C库,并将其编译为C代码(例如,
cc -c your_filename.c
将生成your_filename.o
对象文件) - 创建一个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++源文件中实现这些函数。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值