質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4765閲覧

CからC++の関数を呼ぶ方法を教えて下さい

hello-world

総合スコア1342

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2015/09/26 00:57

CからC++の関数を実行しようとしたところ、うまくコンパイルできませんでした。
どうすればよいでしょうか。

src/hello_cpp.h

lang

1#ifdef __cplusplus 2extern "C" { 3#endif 4 5void hello_cpp(void); 6 7#ifdef __cplusplus 8} 9#endif

src/hello_cpp.cpp

lang

1#include <iostream> 2#include "hello_cpp.h" 3 4void hello_cpp() { 5 std::cout << "Hello C++" << std::endl; 6}

src/main.c

lang

1#include "hello_cpp.h" 2 3int main(int argc, char** argv) { 4 hello_cpp(); 5}

コンパイルコマンド

g++ -c src/hello_cpp.cpp -o tmp/hello_cpp.o gcc tmp/hello_cpp.o src/main.c -o tmp/hello

発生したエラー

sh

1Undefined symbols for architecture x86_64: 2 "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from: 3 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 4 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 5 "std::__1::ios_base::getloc() const", referenced from: 6 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 7 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 8 "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from: 9 std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in hello_cpp.o 10 "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from: 11 std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in hello_cpp.o 12 "std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from: 13 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 14 "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from: 15 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 16 "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from: 17 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 18 "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from: 19 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 20 "std::__1::cout", referenced from: 21 _hello_cpp in hello_cpp.o 22 "std::__1::ctype<char>::id", referenced from: 23 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 24 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 25 "std::__1::locale::~locale()", referenced from: 26 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 27 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 28 "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from: 29 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 30 "std::__1::ios_base::clear(unsigned int)", referenced from: 31 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 32 "std::terminate()", referenced from: 33 ___clang_call_terminate in hello_cpp.o 34 "___cxa_begin_catch", referenced from: 35 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 36 ___clang_call_terminate in hello_cpp.o 37 "___cxa_end_catch", referenced from: 38 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 39 "___gxx_personality_v0", referenced from: 40 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in hello_cpp.o 41 std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in hello_cpp.o 42 std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in hello_cpp.o 43 Dwarf Exception Unwind Info (__eh_frame) in hello_cpp.o 44ld: symbol(s) not found for architecture x86_64 45clang: error: linker command failed with exit code 1 (use -v to see invocation)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GCC版gccであれば"-lstdc++"、LLVM版gccであれば"-lc++"をつけてみてください。

gcc tmp/hello_cpp.o src/main.c -lstdc++ -o tmp/hello または gcc tmp/hello_cpp.o src/main.c -lc++ -o tmp/hello

または、main.cもmain.oにしてから、g++で"hello"を作成してみてください。

g++ -c src/hello_cpp.cpp -o tmp/hello_cpp.o gcc -c src/main.c -o tmp/main.o g++ tmp/hello_cpp.o tmp/main.o -o tmp/hello

解説

C++の標準関数は"libstdc++.so"(Mac等のLLVM版の場合は"libc++.so")で実装されています。g++でオブジェクトのリンクまで行う場合は、リンカ(ld)を呼び出す時のオプションにこれらのライブラリが含まれます。しかし、Cでは不要であることから、gccの場合は含まれません。そのため、gccでリンクを行う時、指定したオブジェクトにC++の標準関数が含まれているとリンクエラーが発生します。

回避方法としては、g++を用いるか、リンカオプションをつけるかになるため、上記の方法となります。

投稿2015/09/26 01:47

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hello-world

2015/09/26 06:30

無事コンパイルすることができました。またコンパイルできない原因を知ることができました。 ありがとうございます。 しかし、作りたかったものは「Cからは普通のライブラリに見えるバイナリ」なのですが、`hello_cpp.o`の中に`libstdc++.so`を埋め込んでおくようなことは可能なのでしょうか。
raccy

2015/09/26 15:12 編集

ソースコードをひっぱってくれば"*.o"にC++標準関数の実装を取り入れることはできないことはありませんが、お勧めしません。 通常、他のプログラムから見えるライブラリにする場合はシェアドオブジェクト"*.so"を作成します。シェアドオブジェクト"*.so"には他にどのライブラリが必要かが記録されていますので、利用するときに`libstdc++.so`をあらためて指定する必要はありません。ライブラリの作成方法等で調べてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問