安装到系统路径时如何安装共享库?

安装到系统路径时如何安装共享库?

我正在尝试如何使用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吗?您应该将它用于installclean目标(备注:您libsgtk.so也应该在 中删除clean)。

相关内容