Makefile make install は複数行コマンドを実行しません。

Makefile make install は複数行コマンドを実行しません。

ソースコードをビルドした後にアクションを実行できる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マクロプロセッサ - ペーストの交換

関連情報