環境
- MacOS Big Sur
- Visual Studio Code (以下,VSCode)
実現したいこと
VSCodeの拡張機能であるCode Runner
を用いてファイル分割したC/C++の実行をショートカットでできるように設定したい.
code runnerのインストールと設定
次の記事を参考にインストールしてください.
デフォルトの設定の問題点
デフォルトの設定では次のような単一ファイルのみをcode runner
でコンパイル&実行することができる.
#include <stdio.h>
int main(void)
{
printf("hello\n"); // => hello
return 0;
}
同階層のディレクトリにhello
という実行ファイルが作成されて,コンソールにhello
と出力される.
よって,ここまでは意図した通りに正しく実行できる.
しかし,デフォルトの設定では次のようなケースでは正しくコンパイルできない.
次のようにファイル分割することを考える.
#include <stdio.h>
void hello(void)
{
printf("hello\n");
}
#ifndef _HELLO_H_
#define _HELLO_H_
void hello();
#endif //_HELLO_H_
#include "hello.h"
int main(void)
{
hello(); // => hello
return 0;
}
ここではファイルの内容に関して詳しく議論しない.
問題となる点はこれがデフォルトの設定では意図したようにコンパイル&実行されないことである.
デフォルトの設定では次のようにコンパイル時のエラーが出力される.
要するに,hello
という関数が定義されてないからどうしたらいいのかわからないといったところである.
問題の本質
分割した
hello.c
がリンクされていないこと
よって,code runner
を実行した時のコンパイルの仕方を変更する必要性がある.
設定の変更
-
gcc $filename
の部分を*.c
に変更する.ついでに,cppも同様にg++ $filename
を*.cpp
に変更する.
つまり,次のように変更する.
"c": "cd $dir && gcc *.c -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
これでファイル分割したC/C++でもcode runner
でhello.c
もリンクされ正しく実行できる.
注意
ここでの設定は
main.c
を実行しているディレクトリにある.c
ファイルしかリンクされない.
よってサブディレクトリにある.c
ファイルはリンクされないので当然ながらコンパイルエラーが出力されるだろう.
もしサブディレクトリに存在するファイルもリンクしたいのなら,
find . -name "*.cpp" -type f | xargs g++ ...
などに変更することで無理矢理実行することはできるかもしれないが,これをしたがために意図しない余計なファイルも同時にリンクされ,実行ファイルのサイズが大きくなったり,関数のバッティングが起こってしまうかもしれない.
なので,この方法はあまりおすすめしない.
どうしても楽に実行することを考えるなら,大人しくMakefile
などを書くことを推していきたい.
おそらくWindows
でも設定方法はほとんど同じであろう.