Technical Knowledge
gcc/g++
[アプリケーション]
MinGw 使用時コンパイルで「D:/tmp/cvs/ccLae3sD.o:main.cpp:(.text+0x5e): undefined reference to `_GetStockObject@4' collect2: ld returned 1 exit status」とエラーが出る。 Cygwin
リンクをはずし、「-mwindows」オプションをつける。
# g++ -mno-cygwin -mwindows main.cpp
リンク時にライブラリとのリンクが認識されない。 Cygwin
ライブラリを先に記述しているため。 後に書く。
CFLAGS=-mno-cygwin -lwsock32 g++ -o a.exe $(CFLAGS) a.o
ではなく
CFLAGS=-mnocygwin LDLIBS=-lwsock32 g++ -o a.exe $(CFLAGS) a.o $(LDLIBS)
unix が定義されていたりしなかったりする。
–mno-cygwin を指定しているため。 –mno-cygwin を指定すると、unix が定義されなくなり、MINGW32 が定義される。
プリプロセス終了時のマクロ定義を調べる。
プリプロセス終了時の定義済みマクロの一覧
# echo "" | gcc -E -dM -
C
# echo "" | gcc -E -dM -x c -
C++
# echo "" | gcc -E -dM -x c++ -
-mno-cygwin -mwindows 時
# echo "" | gcc -E -dM -x c++ -mno-cygwin -mwindows -
アセンブラコードを生成
–S オプション を使用する。
# gcc -S sample.c
Make
[アプリケーション]
別のディレクトリの make を実行すると無限ループになる。
移動後カレントディレクトリが戻っているため。 1 つのコマンドとして実行する。
cd $(DIR_SRC_CPP); \ make CC=$(CC) CFLAGS="$(CFLAGS)";
別のディレクトリの make を実行するとき変数の値を引き渡す。
コマンドライン引数で渡す。
cd $(DIR_SRC_CPP); \ make CC=$(CC) CFLAGS="$(CFLAGS)";
「cpp -> o」等既存ファイルからパス文字を生成する。
OBJS := $(patsubst %.cpp,$(DIR_OBJS)/%.o,$(wildcard *.cpp))