「make」の暗黙的な規則は以下で定義されます。https://www.gnu.org/software/make/manual/make.html#toc-Using-Implicit-Rules。そこに共有オブジェクトの基本的なレシピがありません。共有オブジェクトを作成するときの基本的なレシピはありますか?
走れない
foo: foo.so
「ルールが存在しません」というエラーメッセージが表示されます。
走ることができる時
foo: foo.o
makefileに明示的にルールを追加する必要はありません(したがって、ターゲットファイルを構築するための暗黙のルールがあります)。
OpenAIはこれが共有オブジェクトを構築するための基本的な規則であると言います(しかし、GNUのマニュアルでは確認できません)。
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS)
しかし、私が知っている限り、これは間違っているようです。
答え1
接続したGNU Makeマニュアルの10.1章の直後に、暗黙的なルールの使用を持つ10.2章、組み込みルールディレクトリ。アンディ・ダルトンはこう述べています。
GNU makeバージョンで利用可能なデフォルトの規則と変数の完全なリストについては、
make -p
makefileなしでディレクトリから実行してください。
少なくとも私のシステムのGNU makeバージョンには組み込みのターゲットルールがないようです*.so
。共有オブジェクトに対する Make のデフォルト定義は次のとおりですが、デフォルトは.LIBPATTERNS
.また、基本ルールもありません。lib%.so lib%.a
lib*.so
*.so
Makefile ルールの基本構造は次のとおりです。
target: things_to_make_the_target_out_of ...
だからあなたの
foo: foo.so
既存の共有オブジェクトから実行可能ファイルを作成しようとしているようですが、これは奇妙でおそらく無意味です。
OpenAIの答えは意味があるようです。共有オブジェクトを構築するためのMakefileルールの基本構造。つまり、Makefileを使用して共有オブジェクトを作成すると、次のようになります。
libsomething.so: $(OBJS)
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS)
少なくとも、OBJS変数は正しく定義されています。
答え2
いいえ、そのような暗黙のルールはありません。
しかし、したい場合は、次のようにすることができます。
# my_favorite_recipe.mk
# list of my default rules
%.so: $(OBJ)
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJ)
それを一部に入れて/usr/local/include/my_favorite_recipe.mk
makefileに追加します。
include my_favorite_recipe.mk
OBJ
リストを定義することを忘れないでください。