1. 環境は、macOS High Sierra (version: 10.13.4) 上で行った。
2. プログラム記載~実行は、Visual Studio Code で行った。
今回確認した内容は、ロベールのC++教室 の(第1部)第69章 リンケージである。
以下の “動作確認(改善前)” で、対応できなかったのでメモした。
■動作確認(改善前)
Visual Studio Code 上で、動作確認する上で、以下のルールで行ってきた。
1. 標準入力(cin)が有る場合 … ターミナルを使った動作確認
$ g++ -o abc xxx.cpp
$ ./abc
2. 標準入力(cin)が無い場合 … 下記、3種類のキーを同時押しする動作確認
[command]key + [shift]key + [,]key
■対象プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 第69章 リンケージ. // http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01069.html // プログラムの実行例. // macOS High Sierra (version: 10.13.4) を前提としている. // 1. Terminal. // $ g++ -o abc 1-69_2.cpp // $ ./abc // // 2. Visual Studio Code. // [command]key + [shift]key + [,]key // // -> 上記を試すと, いずれも以下のようなエラーが出力された. // 〜(略)〜 // clang: error: linker command failed with exit code 1 (use -v to see invocation) // 〜(略)〜 // // -> 解決方法は, 1-69_2.cpp に記載した. #include <iostream> using namespace std; // 1-69_2.cpp から 呼び出されるグローバル変数の実体. int ext = 123; // 1-69_2.cpp から 呼び出される関数の実体. // @param: 特に無し. // @return: 特に無し. void eFunction () { cout << "ext = " << ext << endl; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// 第69章 リンケージ. // http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01069.html // // 1. 複数の.cppを分割コンパイル. // http://marupeke296.com/IKDADV_PI_CPP2.html // // 2. コンパイラ(gccコマンド)の使い方 // http://www.ysr.net.it-chiba.ac.jp/data/cc.html // // -> 上記, 1. - 2. を参考に, 以下の形でコンパイルしてみた. // プログラムの実行例(Terminal). // $ g++ -c 1-69_1.cpp -o 1-69_1.o // $ g++ -c 1-69_2.cpp -o 1-69_2.o // $ g++ -g -o abc 1-69_1.o 1-69_2.o // $ ./abc #include <iostream> using namespace std; // 1-69_1.cpp から呼び出す関数. void eFunction (); int main() { // 1-69_1.cpp から呼び出すグローバル変数. extern int ext; eFunction(); ext = 456; eFunction(); return 0; } |
■動作確認(改善前)による実行結果
前述のプログラムを実行した結果、いずれの場合でも、以下のようなエラーが出力された。
〜(略)〜
clang: error: linker command failed with exit code 1 (use -v to see invocation)
〜(略)〜
■動作確認(改善版)
分割コンパイルが必要とのネット上の情報があったので、以下の形で、ターミナル上で対応した。
$ g++ -c 1-69_1.cpp -o 1-69_1.o
$ g++ -c 1-69_2.cpp -o 1-69_2.o
$ g++ -g -o abc 1-69_1.o 1-69_2.o
$ ./abc
■動作確認(改善後)による実行結果
前述のプログラムを実行した結果、以下のように、想定した動作を確認することができた。
■参照サイト
複数の.cppを分割コンパイル