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