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>
编译器前端(例如 gcc
或 g++
)将尝试根据文件扩展名(例如 .c
--> C 和 .cpp
--> C++).
因此,即使我们使用 g++
进行编译,由于 .c
扩展名(相对于预扫描文件内容),它仍将编译为 C。
所以,有一些补救措施:
- 将实际上是 C++ 代码的所有
.c
文件重命名为 .cpp
- 将
-x c++
添加到受影响文件的编译器命令行,以强制它将文件解释为 C++ 代码。这适用于 前端:gcc
或 g++
通常,如果文件是您“拥有”的,(1) 将是选择的方法。也就是说,以正确的方式修复它一次.
如果我们能够说服第 3 方供应商这样做,那将是最好的(即)供应商申请 (1)。
但是,如果供应商不会t/can这样做并且 you/your 公司重命名文件,那么问题 returns 任何时候您从供应商处获取新版本。
因此,更清洁(即一次性修复)是执行 (2) 并修改 您的 build/Makefile 以添加 -x 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>
编译器前端(例如 gcc
或 g++
)将尝试根据文件扩展名(例如 .c
--> C 和 .cpp
--> C++).
因此,即使我们使用 g++
进行编译,由于 .c
扩展名(相对于预扫描文件内容),它仍将编译为 C。
所以,有一些补救措施:
- 将实际上是 C++ 代码的所有
.c
文件重命名为.cpp
- 将
-x c++
添加到受影响文件的编译器命令行,以强制它将文件解释为 C++ 代码。这适用于 前端:gcc
或g++
通常,如果文件是您“拥有”的,(1) 将是选择的方法。也就是说,以正确的方式修复它一次.
如果我们能够说服第 3 方供应商这样做,那将是最好的(即)供应商申请 (1)。
但是,如果供应商不会t/can这样做并且 you/your 公司重命名文件,那么问题 returns 任何时候您从供应商处获取新版本。
因此,更清洁(即一次性修复)是执行 (2) 并修改 您的 build/Makefile 以添加 -x c++