如何编译混合的C和C ++代码?

时间:2012-12-19 20:29:23

标签: gcc compiler-construction makefile

我有一个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代码中?

1 个答案:

答案 0 :(得分:2)

在C ++应用程序中包含C代码是直截了当的(正如您在使用g ++构建二进制文件时发现的那样)。但是,实际上并没有真正支持。我不会说这是不可能的,但是你的“C”代码必须在C ++运行时链接,然后初始化C ++运行时空间。稍后,它也必须终止C ++运行时。我想不出有理由这样做。相反,只需将应用程序创建为C ++,并在C代码中链接,其运行时是C ++运行时的子集。

我应该澄清一下,所有这些都是用C ++编译器编译C代码。它会为您完成上述所有操作。