5
CC = gcc
CFLAGS = -std=c99 -Werror
VPATH = ./src:./include

.MAIN: libstring.so
.PHONY: clean

libstring.o: libstring.c libstring.h
    $(CC) $(CFLAGS) -c $< -I ./include -o $@

libstring.so: libstring.o
    $(CC) -fPIC -shared $< -o $@

clean:
    rm -rf ./*.o ./*.so

<上記のコードスニペットでは、自動変数を正しく使用しているかどうかに特に関心があります。これは、ソース/前提条件がACソースファイルの場合は機能しますが、オブジェクトファイルの場合は失敗するようです。

コンパイルすると、次のエラーが発生します。

gcc -fPIC -shared  -o libstring.so
gcc: No input files specified
4

4 に答える 4

3

GNU makeを使用しています?作成したコードは、GNUmakeで期待どおりに機能します。ただし、他のバージョンのmakeは、明示的なルールでは自動変数をサポートせず、接尾辞(暗黙的な)ルールでのみサポートします。たとえば、SunOS / Solaris makeを使用している場合$<、明示的なルールでは空になります。

于 2012-10-16T03:58:15.367 に答える
1

上手。なぜこれが発生するのかを実際に説明することはできませんが、再現することができ、少なくとも作業の半分を節約できる回避策があります。

私はfreebsd(9.0)を使用しており、$ <、$ @(これはもう推奨されていません-マンページを参照)のようなショートカットや$ {のような「長い」名前を使用しても、ローカル変数とまったく同じ効果があります。 。目標}。私もさまざまな位置で試してみましたが、ローカル変数の1つは単純に無視されているようです。したがって、このステートメントを使用する場合:

libstring.so: libstring.o
    $(CC) -fPIC -shared libstring.o -o $@

すべてが正常にコンパイルされます。私は現在まだ試していますが、あなたのコードはfreebsdマシンで作成されていないので、Makefileとプロジェクトの一部にgnu設定が付属している可能性があり、これが少しスクランブルされます。

上記の「1つ」に関しては、ここにいくつかのMakefileがあり、さらに別の変数($ ^など)を追加すると、作業エントリも生成されます。このような:

libstring.so: libstring.o
    $(CC) -fPIC -shared $< -o $@ $^

Linuxからfreebsdに多くの移植を行っているので、私はまだそれを続けています。それで、おそらく最後のポイントを見つけるでしょう。しかし、私の推測では、それは「元の」freebsdソースではないので、Makefile構文もそうではありません。

make -d Aを呼び出して、makeコマンドがローカル変数をどのように処理するかを確認します

あいさつジミー

于 2012-11-12T19:39:38.533 に答える
0

この場合はおそらく必要です$^$^はすべての前提条件のリストであり、$<はターゲットよりも最近変更された単一の前提条件です。

于 2012-10-15T21:11:34.563 に答える
-1

あなたが説明した現象を再現できませんでした。問題の説明が不完全であるか、のバージョンにmakeバグがあります。

brian@hplaptop:~/src/so/mk$ echo 'int foo;' > libstring.c
brian@hplaptop:~/src/so/mk$ cat Makefile

all: libstring.so

libstring.so: libstring.o
    $(CC) -fPIC -shared $< -o $@

brian@hplaptop:~/src/so/mk$ make
cc    -c -o libstring.o libstring.c
cc -fPIC -shared libstring.o -o libstring.so
brian@hplaptop:~/src/so/mk$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu
于 2012-10-16T04:10:18.090 に答える