C++ STD 库

C++ STD libraries in C

如标​​题所示,我正在尝试在一个项目中混合使用 C 和 C++ 源文件。

我的项目有以下文件

.
├── comms
│   ├── can.c
├── config_parsing
│   ├── config_parser.c
│   ├── file_operations.c
├── main.cpp
├── scheduler.c
├── signal_handler.c
├── thread_health.c
└── utilities
    ├── logger.c
    ├── ring_buffer.c
    ├── string_operations.c
    ├── time_conversions.c

在 Eclipse 中编译、构建和部署。我正在添加来自供应商的代码,我无法共享它,因为它是购买的代码。他们有 SSL 代码,其中有 .h.c 文件。在头文件中我们有

#include <openssl/err.h>
#include <string>
#include <vector>

在 C 文件中,我们有许多 std::vector<unsigned char>std::string 的实例。这不会编译。

我正在使用 Yocto 生成的 SDK 构建我的应用程序,我可以确认我的包含路径中存在适当的文件

/opt/fsl-imx-fb/5.10-hardknott/sysroots/cortexa7t2hf-neon-poky-linux-gnueabi/usr/include/c++/10.2.0

在线查看时,我看到了如何在 C++ 应用程序中正确包含 C 头文件,但我似乎无法找到如何在 C 文件中使用 std::vector。如果需要,我可以分享日食 compiler/build 设置的图像。

应用程序构建于 Ubuntu。

要显示的图片

无法在 C 文件中使用 std::vector,因为 C 没有名称空间、类 或模板。

最接近的是 C++ 代码可以获得指向向量内容的指针,并将指针传递给 C 代码,C 代码可以在那里读取或写入数据,因为 C 确实有指针。

if you want to provide an answer, I will gladly accept it! The -c c++ option has worked! – Michael

很明显,.c 文件中的代码是 C++ 代码,不是 C 代码。您发现的 #include 指令证明了这一点:

#include <string>
#include <vector>

编译器前端(例如 gccg++)将尝试根据文件扩展名(例如 .c --> C 和 .cpp --> C++).

因此,即使我们使用 g++ 进行编译,由于 .c 扩展名(相对于预扫描文件内容),它仍将编译为 C。

所以,有一些补救措施:

  1. 将实际上是 C++ 代码的所有 .c 文件重命名为 .cpp
  2. -x c++ 添加到受影响文件的编译器命令行,以强制它将文件解释为 C++ 代码。这适用于 前端:gccg++

通常,如果文件是您“拥有”的,(1) 将是选择的方法。也就是说,以正确的方式修复它一次.

如果我们能够说服第 3 方供应商这样做,那将是最好的(即)供应商申请 (1)。

但是,如果供应商不会t/can这样做并且 you/your 公司重命名文件,那么问题 returns 任何时候您从供应商处获取新版本。

因此,更清洁(即一次性修复)是执行 (2) 并修改 您的 build/Makefile 以添加 -x c++