[英]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
。 如果需要,我可以共享 Eclipse 編譯器/構建設置的圖像。
該應用程序在 Ubuntu 中構建。
不可能在 C 文件中使用std::vector
,因為 C 沒有名稱空間、類或模板。
最接近的是 C++ 代碼可以獲得指向向量內容的指針,並將指針傳遞給 C 代碼,C 代碼可以在那里讀取或寫入數據,因為 C 確實有指針。
如果你想提供答案,我很樂意接受! -c c++ 選項有效! – 邁克爾
很明顯, .c
文件中的代碼是 C++ 代碼而不是C 代碼。 您發現的#include
指令證明了這一點:
#include <string>
#include <vector>
編譯器前端(例如gcc
或g++
)將嘗試根據文件擴展名(例如.c
--> C 和.cpp
--> C++)確定要使用的語言。
因此,即使我們使用g++
編譯,由於.c
擴展名(與預掃描文件內容相比),它仍然會編譯為 C。
所以,有一些補救措施:
.c
文件重命名為.cpp
-x c++
添加到受影響文件的編譯器命令行以強制它將文件解釋為 C++ 代碼。 這適用於任一前端: gcc
或g++
通常,如果文件由您“擁有”,則 (1) 將是選擇的方法。 也就是說,以正確的方式修復一次。
如果我們可以說服第 3 方供應商這樣做,那將是最好的(即)供應商申請(1)。
但是,如果供應商不會/不能這樣做並且您/您的公司重命名文件,則只要您從供應商處獲取新版本,問題就會再次出現。
因此,更清潔(即一次性修復)是執行 (2) 並修改您的構建/Makefile 以添加-x c++
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.