5

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 コードに含めるにはどうすればよいですか?

4

1 に答える 1

2

C コードを C++ アプリケーションに含めるのは簡単です (g++ を使用してバイナリをビルドしたときに発見したように)。ただし、他の方法は実際にはサポートされていません。不可能とは言いませんが、「C」コードは C++ ランタイムにリンクしてから、C++ ランタイム空間を初期化する必要があります。後で、C++ ランタイムも終了する必要があります。勝手にやる理由が思いつきません。代わりに、アプリケーションを C++ として作成し、ランタイムが C++ ランタイムのサブセットである C コードにリンクするだけです。

これはすべて、C コードを C++ コンパイラでコンパイルすることを意味することを明確にしておく必要があります。上記のすべてを処理します。

于 2012-12-19T20:42:37.683 に答える