OHL*_*ÁLÁ 5 compiler-construction gcc 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
Run Code Online (Sandbox Code Playgroud)
这是一个简单的测试
#include "cmpc_ekf.h"
#include <stdio.h>
int main(int argc, char* argv[]) {
init_motor();
}
Run Code Online (Sandbox Code Playgroud)
我试图使用静态库来包含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
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误(这只是错误代码中的一个标记)
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&)'
Run Code Online (Sandbox Code Playgroud)
如果我g++用来创建二进制文件,那么一切正常.如何在不使用g++或-lstdc++在创建二进制文件的情况下将C++类或库包含到C代码中?
在 C++ 应用程序中包含 C 代码非常简单(正如您在使用 g++ 构建二进制文件时发现的那样)。但是,并不真正支持采用其他方式。我不会说这是不可能的,但您的“C”代码必须链接到 C++ 运行时,然后初始化 C++ 运行时空间。稍后,它还必须终止 C++ 运行时。我想不出有什么理由可以立即这样做。相反,只需将应用程序创建为 C++ 并链接到其运行时是 C++ 运行时子集的 C 代码中。
我应该澄清一下,这一切意味着使用 C++ 编译器编译 C 代码。它会为您处理以上所有事项。