gcc でライブラリとリンクがどのように機能するかを理解しようとしています。ファイルtest.cからサンプルの ncurses
「Hello World」プログラムをコンパイルしようとしています:
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
最初に、次のコマンドを使用して (makefile なしで) コンパイルしました。
gcc test.c -o test.exe -lncurses
これにより、9kb のファイルが作成されました。スイッチが何をするのか理解できなかったので、リンクについて、次に静的と動的について少し読んで、ここで-lncurses
静的にコンパイルしてみようと決めました。
gcc -static test.c -o test.exe -lncurses
しかし、何らかの理由でそれが機能せず、大量のld
「x への未定義参照」エラーが発生しました。例:
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libncurses.a(lib_echo.o): In function `echo':
(.text+0x3): undefined reference to `SP'
-L/usr/lib
別の場所から、オプションを追加しました:
gcc -static test.c -o test.exe -L/usr/lib -lncurses
これにより、1103kb のより大きなファイルが作成されました。
なぜそれを大きくする必要があるのか 理解できます。私が理解していないのは、-static
オプションだけを削除する理由です:
gcc test.c -o test.exe -L/usr/lib -lncurses
...ライブラリに静的にリンクされていないにもかかわらず、サイズが184kbのファイルを生成しますncurses
。
ここで -L/usr/lib オプションは何をしていますか? オンラインドキュメントによると、ディレクトリを「 -l で検索するディレクトリのリストに追加します」。/usr/lib ディレクトリにはlibncurses.a
(とりわけ) ファイルがあり、/usr/include にはncurses.h
へのシンボリック リンクcurses.h
とncurses_dll.h
. おそらくlibncurses.a
ファイルは動的ライブラリではありませんか? じゃあ何ncurses.h
?