2016-04-15 14 views
0

stdC++ライブラリでcプログラムにコンパイルできないという問題があります。私はUbuntu 14.04、gcc 4.9です。'c'プログラムでgcc/g ++を使用してstdC++でコンパイルする際の問題

私の質問です:stdC++でcプログラムにコンパイルすることは可能ですか?これはarmhf-linuxのクロスコンパイラ/ライブラリを使ってもできますか?私はコンパイルするには、次のコマンドラインを使用してい

g++ -c cppfile.cpp 
gcc -o cfile -lstdc++ cppfile.o cfile.c 

私はまた、代わりのgcC++グラムを使用してみましたが、私は同じエラーを取得します。

私の主なファイルは次のとおりです。

// cfile.c 
#include <string.h> 
#include <stdio.h> 
#include "cppfile.h" 

int main() 
{ 
    printf("Hello"); 
    myFunction(); 

    return 0; 
} 

私のC++ファイルはこちらです:

// cppfile.cpp 
#include <string> 

using namespace std; 

extern "C" { 
int myFunction() 
{ 
    std::string s = "hi"; 
    return 1; 
} 
} 

ヘッダファイル:

// cppfile.h 
int myFunction(); 

コンパイル出力は次のとおりです。

cppfile.o: In function `myFunction': 
cppfile.cpp:(.text+0xf): undefined reference to `std::allocator<char>::allocator()' 
cppfile.cpp:(.text+0x27): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)' 
cppfile.cpp:(.text+0x36): undefined reference to `std::allocator<char>::~allocator()' 
cppfile.cpp:(.text+0x4a): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' 
cppfile.cpp:(.text+0x5f): undefined reference to `std::allocator<char>::~allocator()' 
cppfile.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'  collect2: error: ld returned 1 exit status 

これは重複していると申し訳ありませんが、このような質問は見つかりませんでした。

+0

変更 'cppfile.h'が効果的に'読みにextern "C" int型MyFunctionを()する; 'C++のコンパイルのためにシステムに組み込むだけのよう(' #ifdefの__cplusplus'ガードを使用して'/ usr/include'にあるファイル)は、' cppfile.h'ヘッダをC++ファイルに '#include 'しないようにしてください。あなたがそれをしないと、 'myFunction()'を呼び出そうとしているC++のコードは、[変更されたシンボル名](https://en.wikipedia.org/wiki/Name_mangling#C.2B.2B)を見つけようとします)。 –

+0

1)各* .cファイルを別々にコンパイルしてください。同じ行でコンパイルとリンクを試みないでください。 (注:同じ行のコンパイル/リンクは可能ですが、それを正しく実行する必要があります)2)gccリンカーは、コマンドライン引数を左から右の順に処理します。 '-l'パラメータを扱うとき、解決される必要のある解決されていない参照がまだありません。コンパイル/リンク時に 'gcc cppfile.o cfile.o -lstdC++' – user3629249

+0

の順番でリンクコマンドラインを書いてください。C++はすべての関数の名前を変更します。したがって、コンパイルのステップでは、関数名がマングルされたオブジェクトファイルが必要になります – user3629249

答えて

0

これは動作するはずです:

g++ -c cppfile.cpp 
gcc -c cfile.c 
g++ -o cfile cppfile.o cfile.o 
関連する問題