ソースコードをビルドした後にアクションを実行できるinstall
セクションを含むMakefileがあります。make install
このinstall
セクションには、2行のシェルコマンドが含まれています。
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
したがって、最初の行はlibxxx.soをコピーし、2行目は最終実行可能ファイルがlibxxx.soファイルを見つけることができるように環境/usr/local/lib
変数を設定します。LD_LIBRARY_PATH
/usr/local/lib
ただし、make install
コマンドラインから実行した場合は、次のように入力します。
echo $LD_LIBRARY_PATH
予想されるコンテンツの代わりに空のコンテンツが表示されます/usr/local/lib
。それでは、Makefileの2番目のコマンドラインはなぜ実行されないのですか?
答え1
make
ほぼ確実に2行のコマンドが実行されています。ただし、その行export LD_LIBRARY_PATH=$<
(またはmake
それを拡張するすべての項目)は、このプロセスの子としてシェルによって実行されますmake
。と入力すると、echo $LD_LIBRARY_PATH
環境変数LD_LIBRARY_PATHのすべての内容が取得されます。シェルは、「エクスポート」を実行せずにこれを実行するサブプロセスですmake
。ファイルまたは別のファイルにエクスポートするか、手動で入力する必要があり.bashrc
ます.zshrc
。
答え2
努力する:
export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)
install:
#Do Install actions
バラよりマニュアルセクション5.3の作成サブシェルに対するBruceの正しい仮定を説明するには、次のようにします。StackOverflowへの答えです。は、すべてのコマンドを1行で実行する必要があることを示します。
修正する
1行のコードが機能しないため、次の例を使用してください(最終的なメイクファイルが機能するように次のファイルが含まれています)。
ファイル一覧:
こんにちはマーク.c
#include
int main() {
// call a function in another file
myPrintHelloMake();
return(0);
}
hellofunc.c
#include
#include
void myPrintHelloMake(void) {
printf("Hello makefiles!\n");
return;
}
hellomake.h
/*
example include file
*/
void myPrintHelloMake(void);
最終ファイル一覧
ファイルの生成
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
上記のメイクファイルはマクロと文字列拡張を使用して、コマンドなしでインクルードディレクトリとライブラリディレクトリを正しく設定しますexport
。あなたの場合は、渡してからコンパイル/usr/local/libs
するLDIR
ことが始まります。
引用する
メイン州コルビーカレッジコンピュータ工学科 - Makefile Tutorial
M4マクロプロセッサ - ペーストの交換