🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

リンカ

リンカはコンパイルされたオブジェクトコードに、必要なライブラリなどを付け加えて、実行可能ファイルを生成するプログラムです。コンパイルされたオブジェクトのコードを複数のファイルで取得し、"linked"という一つの実行可能のファイルを生成します。

C++

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

Q&A

2回答

8863閲覧

c++ ファイル分割して書いたコードをvscodeで実行する方法

goro_gnm

総合スコア42

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

リンカ

リンカはコンパイルされたオブジェクトコードに、必要なライブラリなどを付け加えて、実行可能ファイルを生成するプログラムです。コンパイルされたオブジェクトのコードを複数のファイルで取得し、"linked"という一つの実行可能のファイルを生成します。

C++

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

0グッド

0クリップ

投稿2019/09/19 01:18

ファイル分割して記述したコード、例えば下に書いたような
クラスの宣言をSample.hファイルに
その実装をSample.cppファイルに
そしてmain関数をmain.cppファイルに書いた
コードを実行したいのですが、どうすればいいのかわかりません。

vscodeを使っています。
分割されていないファイルを実行するときのように、

c++

1gcc -o program main.cpp

とすればいいのかと思ったのですが、そうではないのですね。
ビルドの処理の中のリンクの部分ができていないということでしょうか。
教えていただけると助かります。

以下、分割して書いたコードの例

c++

1//ファイル名 Sample.h 2#ifndef _SAMPLE_H_ 3#define _SAMPLE_H_ 4 5class Sample{ 6public: 7 int a; // publicなメンバ変数 8private: 9 int b; // privateなメンバ変数 10public: 11 void func1(); 12private: 13 void func2(); 14}; 15 16#endif // _SAMPLE_H_

c++

1//ファイル名 Sample.cpp 2#include "Sample.h" 3#include <iostream> 4 5using namespace std; 6 7void Sample::func1(){ 8 cout << "func1" << endl; 9 a = 1; 10 b = 1; 11 func2(); // func2ないから、func1を呼び出す 12} 13void Sample::func2(){ 14 a = 2; 15 b = 2; 16 cout << "a=" << a << "," << "b=" << b << endl; 17}

c++

1//ファイル名 main.cpp 2#include "Sample.h" 3#include <iostream> 4 5using namespace std; 6 7int main(){ 8 Sample s; 9 s.a = 1; 10 //s.b = 2; 11 s.func1(); 12 //s.func2(); 13}

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

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

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

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

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

guest

回答2

0

gccで直接コンパイルさせるのでしたら、対象ファイルを列挙していけばよいです。
でも、ファイル単位にモジュール分割して管理することも念頭に置かれてるんですよね?おそらく、ファイルの数も増えていくことでしょうから、それならば、make等のビルドツールを使うやり方に移行した方がよいと思います。

VSCODE越しに叩くと言った回答でなくて申し訳ないですが。

投稿2019/09/19 01:43

archiver

総合スコア1567

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

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

0

質問記載のコードでは1ファイルの場合でもgcc -o program main.cppではリンクエラー出ますよね?
-lstdc++オプションを付けるか、g++コマンドを使用してください。

gcc -o program main.cpp Sample.cpp -lstdc++ or g++ -o program main.cpp Sample.cpp

コンパイル・リンクに必要なソースファイルをすべて指定しましょう。

gcc -o program main.cpp Sample.cpp

投稿2019/09/19 01:43

編集2019/09/19 05:09
Y.H.

総合スコア7918

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

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

goro_gnm

2019/09/19 03:42

列挙すればいい感じなんですね! けどやってみると linker command failed with exit code 1 とでてしまいました... これはどうしたらいいのでしょうか...
Y.H.

2019/09/19 03:50

エラーメッセージはそれで全文ですか?
goro_gnm

2019/09/19 04:00

すみません全文じゃないです。 もっと長いです。 全文はつぎの通りです。 Undefined symbols for architecture x86_64: "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from: std::__1::ctype<char> const& std::__1::use_facet<std::__1::ctype<char> >(std::__1::locale const&) in Sample-a60ebf.o "std::__1::ios_base::getloc() const", referenced from: std::__1::basic_ios<char, std::__1::char_traits<char> >::widen(char) const in Sample-a60ebf.o "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(unsigned long, char) in Sample-a60ebf.o "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from: 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 Sample-a60ebf.o "std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from: 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 Sample-a60ebf.o "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from: 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 Sample-a60ebf.o "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from: 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 Sample-a60ebf.o "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from: 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 Sample-a60ebf.o "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(int)", referenced from: Sample::func2() in Sample-a60ebf.o "std::__1::cout", referenced from: Sample::func1() in Sample-a60ebf.o Sample::func2() in Sample-a60ebf.o "std::__1::ctype<char>::id", referenced from: std::__1::ctype<char> const& std::__1::use_facet<std::__1::ctype<char> >(std::__1::locale const&) in Sample-a60ebf.o "std::__1::locale::~locale()", referenced from: std::__1::basic_ios<char, std::__1::char_traits<char> >::widen(char) const in Sample-a60ebf.o "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from: 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 Sample-a60ebf.o "std::__1::ios_base::clear(unsigned int)", referenced from: std::__1::ios_base::setstate(unsigned int) in Sample-a60ebf.o "std::terminate()", referenced from: ___clang_call_terminate in Sample-a60ebf.o "___cxa_begin_catch", referenced from: 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 Sample-a60ebf.o ___clang_call_terminate in Sample-a60ebf.o "___cxa_call_unexpected", referenced from: std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >::ostreambuf_iterator(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in Sample-a60ebf.o "___cxa_end_catch", referenced from: 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 Sample-a60ebf.o "___gxx_personality_v0", referenced from: 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 Sample-a60ebf.o 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 Sample-a60ebf.o std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >::ostreambuf_iterator(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in Sample-a60ebf.o std::__1::basic_ios<char, std::__1::char_traits<char> >::widen(char) const in Sample-a60ebf.o Dwarf Exception Unwind Info (__eh_frame) in Sample-a60ebf.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Y.H.

2019/09/19 04:49

> 分割されていないファイルを実行するときのように 分割していないmain.cppの1ファイルで正常にコンパイル実行できるソースを質問に記載ください。
nomuken

2019/09/19 13:59

c++ソースのようなのでgccコマンドでなくg++コマンドを使ってみてはどうですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問