最近、私は APUE を読んで、本の Web サイトで提供されている既存の .mk Makefile を使用する代わりに、自分で Makefile をセットアップしています。私の Makefile は次のようになります。
CC=gcc
LD=ld
CC_FLAGS= -c -I ./include/ -Wall -Wextra
LD_FLAGS= -e main -lc
LIB_OBJS= ./lib/*.o #There'are about 30 .c files in lib, \
most of which are wrap of error handling routines or simplified APIs. \
So I don't copy them all in the code block
all:
ls: ls.c $(LIB_OBJS)
$(CC) $(CC_FLAGS) -o ls.o ls.c
$(LD) $(LD_FLAGS) -o ls ls.o ./lib/error.o
$(LIB_OBJS):
cd ./lib; \
make
clean:
cd ./lib; \
make clean
rm ./ls
./lib の Makefile は、そのディレクトリ内のすべての .c ファイルを gcc -c するだけで、リンク作業を行わないため、これとほとんど同じです。そして、ls.c は、与えられた dirent のすべての要素をリストするだけの第 1 章の最初のコードです。私の問題は、私のMakefileはエラーを出力せずに実行可能ファイルを生成できますが、このファイルはまったく実行可能ではないということです。x 特権で ./ls を実行すると、bash は次のように返します。
bash: ./ls: No such file or directory
しかし、gcc を使用して ls.o と ./lib/error.o をリンクすると、スムーズに動作します。そこで、gcc の ld 呼び出しの何が特別なのだろうと考えました。ld だけを使用して gcc で生成されたものをリンクする場合はどうすればよいですか? よろしくお願いします!