Make

安裝到系統路徑時如何安裝共享庫?

  • March 24, 2018

我正在試驗如何使用Makefile. 共享庫稱為libsgtk.so. 這是我的第一次嘗試Makefile

CFLAGS= -pthread \
      -I/usr/include/gtk-3.0 \
      -I/usr/include/pango-1.0 \
      -I/usr/include/atk-1.0 \
      -I/usr/include/cairo \
      -I/usr/include/gdk-pixbuf-2.0 \
      -I/usr/include/glib-2.0 \
      -I/usr/lib/x86_64-linux-gnu/glib-2.0/include

all: libsgtk.so

libsgtk.so: window.o
   gcc -shared -o libsgtk.so window.o

window.o: window.c
   gcc $(CFLAGS) -c -fpic window.c

clean:
    rm window.o

install:
   mv libsgtk.so /usr/local/lib

如您所見,我已將安裝路徑硬編碼為/usr/local/lib. 這是推薦的方法嗎?如果該路徑中已經存在同名庫怎麼辦?是否應該在 Makefile 中進行檢查,或者是否應該使用其他一些工具來為我提供替代安裝路徑?

我認為你應該使用變數。例如:

DESTDIR?=/usr/local/lib
...
install:
 mv libsgtk.so ${DESTDIR}

make DESTDIR=/usr/lib在這種情況下,使用者可以用(注意?上面)覆蓋預設值。

如果你願意,你可以測試它。也許這不是一個壞主意。更簡單的方法是使用mv -n(or mv -nv) 而不是mv: 不會覆蓋現有文件。它的主要缺點是返回值mv為零,因此make不會知道移動沒有成功。

但是,如果您使用cp(copy) 代替mv它會很好:cp -n當目標文件存在時返回 1(非零)。所以解決方案(包括測試):

install:
 cp -n libsgtk.so ${DESTDIR}

只有一個有幫助的問題:您知道 中的PHONY目標Makefile嗎?您應該將它用於installclean目標(備註:您也應該libsgtk.so在 中刪除clean)。

引用自:https://unix.stackexchange.com/questions/433293