我正在尝试如何使用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 中检查这一点,或者是否应该使用其他一些工具来为我提供替代安装路径?
答案1
我认为你应该使用变量。例如:
DESTDIR?=/usr/local/lib
...
install:
mv libsgtk.so ${DESTDIR}
在这种情况下,用户可以使用make DESTDIR=/usr/lib
(注意?
上面的内容)覆盖默认值。
如果你愿意的话可以测试一下。也许这不是一个坏主意。更简单的方法是使用mv -n
(或mv -nv
) 代替mv
: 不会覆盖现有文件。它的主要缺点是返回值mv
为零,因此make
不会知道移动是否成功。
但如果您使用cp
(copy) 而不是mv
它会很好:cp -n
当目标文件存在时,返回 1 (非零)。所以解决方案(包括测试):
install:
cp -n libsgtk.so ${DESTDIR}
只是一个有帮助的问题:您知道PHONY
中的目标Makefile
吗?您应该将它用于install
和clean
目标(备注:您libsgtk.so
也应该在 中删除clean
)。