0

C コードから C++ メソッドを呼び出すときに問題が発生します。C++ コードで呼び出す必要があるメソッドがクラス内にありません。簡単な例をセットアップしようとしていますが、次のファイルがあります。

//header.h
#ifdef __cplusplus
#include <iostream>
extern "C" {
#endif
int print(int i, double d);
#ifdef __cplusplus
}
#endif

//ccode.c
#include "header.h"

main() {
        printf("hello");
        print(2,2.3);
}

//cppcode.cc
#include "header.h"
using namespace std;
int print(int i, double d)
{
    cout << "i = " << i << ", d = " << d;
}

おそらく私のエラーは、これをコンパイルしてリンクしようとしている方法にあります。私は次のことをしています:

g++ -c cppcode.cc -o cppcode.o

それはうまくいきます。

gcc ccode.c cppcode.o -o ccode

ここで、次のエラーが発生します。

cppcode.o: In function `print':
cppcode.cc:(.text+0x16): undefined reference to `std::cout'
cppcode.cc:(.text+0x1b): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
cppcode.cc:(.text+0x28): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
cppcode.cc:(.text+0x35): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
cppcode.cc:(.text+0x42): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(double)'
cppcode.o: In function `__static_initialization_and_destruction_0(int, int)':
cppcode.cc:(.text+0x6b): undefined reference to `std::ios_base::Init::Init()'
cppcode.cc:(.text+0x70): undefined reference to `std::ios_base::Init::~Init()'
collect2: ld returned 1 exit status

これは、C コンパイラを使用しているためだと思います。この小さな例をコンパイルしてリンクする正しい方法は何ですか? アイデアは、C コードを実行し、C で書き直す必要なく、C++ 関数を呼び出すだけであるということです。事前に助けてくれてありがとう!

Ubuntu 12.04、gcc バージョン 4.6.3 を使用しています

4

3 に答える 3

2

C++ ランタイム ライブラリをリンクする必要があります。

gcc ccode.c cppcode.o -o ccode -lstdc++
于 2013-03-13T17:50:44.130 に答える
1

コンパイルとリンクは別々に行う必要があります。g++適切な標準ライブラリを取得するためにリンクするために使用します。

g++ -c cppcode.cc -o cppcode.o
gcc -c ccode.c -o ccode.o
g++ ccode.o cppcode.o -o ccode
于 2013-03-13T17:51:19.360 に答える
0

g++ コンパイラは、プログラムを標準の cpp ライブラリに自動的にリンクします。gcc でコンパイルすると、リンカはそれへの参照を見つけることができます。2 つのオプションがあります。1 つは、c ファイルを g++ でコンパイルすることです。2 つ目は、標準の cpp ライブラリのリンクを強制することです。

gcc ガイドに書かれている内容は次のとおりです: -static-libstdc++

When the g++ program is used to link a C++ program, it normally automatically links against libstdc++. If libstdc++ is available as a shared library, and the -static option is not used, then this links against the shared version of libstdc++. That is normally fine. However, it is sometimes useful to freeze the version of libstdc++ used by the program without going all the way to a fully static link. The -static-libstdc++ option directs the g++ driver to link libstdc++ statically, without necessarily linking other libraries statically.

次のコマンドを実行します。

gcc ccode.c cppcode.o -o ccode -lstdc++
于 2013-03-13T17:51:17.770 に答える