将 C 和 C++ 与 CMake 混合

Posted

技术标签:

【中文标题】将 C 和 C++ 与 CMake 混合【英文标题】:Mix C and C++ with CMake 【发布时间】:2018-01-14 12:06:02 【问题描述】:

我有一个用 C 编写的项目(在 Linux 上),现在想使用提供 .h 和 .c 源文件的第三方 C++ 库。

我将 .c 文件重命名为 .cpp,然后将此库包含在 C 项目中。但是编译时出现如下错误:

unknown type name ‘class’

补充:第三方库在这里https://github.com/0xmalloc/c-log 作者说它对C和C++都很友好

【问题讨论】:

您不能将包含 C++ 类声明的 .h 文件#include 到 C 中。 “我将 .c 文件重命名为 .cpp” - 为什么? “提供 .h 和 .c 源文件的 C++ 库”更像是一个 C 库。 Readme.md 说它适用于“C/C++ 语言”。也许你应该问作者在哪里可以找到该语言的编译器。 【参考方案1】:

这里有两个选项:

您使您的整个项目成为 C++ 项目 - 这并不意味着您需要将 C 代码转换为 C++,而是您可能必须接触其中的这部分和那部分,并且选择 C++ 而不是 C - 仅编译器 提供包装器 - 通常如果您以 C 风格(没有类等)编写 C++ 代码,您只需为您的 C++ 函数执行 extern "C" void foo() 例程。但是,当您开始使用 C 不支持的功能时,您必须为您的 C++ 功能提供包装器,以便它可以暴露给应用程序的 C 部分。这样的过程可以从非常简单到难以置信的复杂。例如,许多现代 C/C++ API 也提供 Python API。为了做到这一点而不必重写 Python 中的所有内容,作者创建了将 C/C++ 功能转换为 Python 的包装器。取决于完成的好坏,目标语言的特性(如果我们从 C/C++ 到 Python 的情况下是 Python)可用于允许更好的错误处理、类型检查、可读性、本机(目标语言)数据容器等。

我确实认为该库的作者误导了您,因为该库显然是针对 C++ 的(标题中的类绝对是最明显的 C++ 尖叫)。

【讨论】:

以上是关于将 C 和 C++ 与 CMake 混合的主要内容,如果未能解决你的问题,请参考以下文章

使用 CMake 链接到可可库(C++ 与 Objective-C 混合)

调试经验C++和C的混合编程以及库调用

是否可以使用 LWJGL 将 C++ OpenGL 代码与 Java 混合?

我们可以将 c++ 标准编译与 MSVC 混合使用吗?

Linux上C++与CUDA混合编程

Linux上C++与CUDA混合编程