2012-12-19 48 views
4

我有一個C++類,我想用C代碼,包括,所以我寫了一個包裝:如何編譯混合的C和C++代碼?

#ifndef __PMPC_CMPC__ 
#define __PMPC_CMPC__ 

#ifdef __cplusplus 
extern "C" 
#endif 
void init_motor(); 

#ifdef __cplusplus 
extern "C" 
#endif 
double* calc_cont_sig(double *); 

#endif 

,這是一個簡單的測試

#include "cmpc_ekf.h" 
#include <stdio.h> 
int main(int argc, char* argv[]) { 
    init_motor(); 
} 

我試圖用靜態庫包括C++代碼,所以這是我的Makefile:

all : main.o libcmpc_ekf.a 
    gcc $(EFLAGS) $(CFLAGS) -static -o main.out main.o -L. -lcmpc_ekf 

main.o: libcmpc_ekf.a 
    gcc $(EFLAGS) $(CFLAGS) -static -c main.c -L. -lcmpc_ekf 

libcmpc_ekf.a: cmpc_ekf.o 
    ar rcs libcmpc_ekf.a cmpc_ekf.o 

cmpc_ekf.o: 
    g++ $(EFLAGS) $(CPPFLAGS) -c cmpc_ekf.cpp 

clean: 
    rm *.o main.out 

但我發現了以下錯誤(這僅僅是從錯誤代碼的令牌)

cmpc_ekf.cpp:(.text+0x40): undefined reference to `std::cout' 
cmpc_ekf.cpp:(.text+0x45): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 

如果我使用g++創建二進制文件比一切正常。當我創建二進制文件時,如何在不使用g++-lstdc++的情況下將C++類或庫包含到C代碼中?

回答

2

將C代碼包含在C++應用程序中是很簡單的(正如您在使用g ++構建二進制文件時發現的那樣)。但是,換個角度並不真正支持。我不會說這是不可能的,但是你的「C」代碼必須在C++運行庫中鏈接,然後初始化C++運行時空間。稍後,它也必須終止C++運行時。我想不出有什麼理由要這樣做。相反,只需將應用程序創建爲C++並鏈接到運行時爲C++運行時的子集的C代碼中。

我應該澄清,這一切意味着編譯您的C代碼與C++編譯器。它爲您處理上述所有問題。