Makefile 链接X11库的最佳实践

Makefile 链接X11库的最佳实践,makefile,portability,Makefile,Portability,我有一个在RedHat box上开发的X11应用程序。当我移动到CentOS时,X11库也移动了。从/usr/X11R6/lib64到/usr/X11R6/lib(即使两者都运行64位),我在其他Linux/Unix系统的其他地方也看到了它们 我曾使用-I和-L编译标志直接指向makefile中的X11 lib目录,但后来意识到,这需要在切换机器时更改makefile 我的问题是,为了便于携带。。。我应该继续在makefile中使用-I和-L?如果是,有没有办法自动检测位置?或者,我应该仅仅依靠

我有一个在RedHat box上开发的X11应用程序。当我移动到CentOS时,X11库也移动了。从
/usr/X11R6/lib64
/usr/X11R6/lib
(即使两者都运行64位),我在其他Linux/Unix系统的其他地方也看到了它们

我曾使用
-I
-L
编译标志直接指向makefile中的X11 lib目录,但后来意识到,这需要在切换机器时更改makefile


我的问题是,为了便于携带。。。我应该继续在makefile中使用
-I
-L
?如果是,有没有办法自动检测位置?或者,我应该仅仅依靠用户在其LD_LIBRARY_路径中拥有这些吗?

如果您依赖GNU make,您可以执行以下操作:

X11LIBS ?= $(word 1, $(dir $(wildcard /usr/X11R6/lib64/libX11.so.*)))
X11LIBS ?= $(word 1, $(dir $(wildcard /usr/X11R6/lib/libX11.so.*)))
X11LIBS ?= $(word 1, $(dir $(wildcard /usr/lib/libX11.so.*)))
# and so on for whatever paths you come across

LDFLAGS += -L$(X11LIBS) -R$(X11LIBS)
这允许用户覆盖命令行上的X11LIBS(
make X11LIBS=/usr/local/X11R6/lib
),并在未提供用户选项的情况下尝试几个位置

如果找不到路径,甚至可以中止构建,如

 ifeq ($(X11LIBS),)
 $(error Could not find X11 library path, please specify in X11LIBS
 endif

如果您满足于限制Makefile的可移植性,那么所有这些都只是一个选项:非GNU make很可能对这些宏不满意。

如果您依赖GNU make,您可以执行以下操作:

X11LIBS ?= $(word 1, $(dir $(wildcard /usr/X11R6/lib64/libX11.so.*)))
X11LIBS ?= $(word 1, $(dir $(wildcard /usr/X11R6/lib/libX11.so.*)))
X11LIBS ?= $(word 1, $(dir $(wildcard /usr/lib/libX11.so.*)))
# and so on for whatever paths you come across

LDFLAGS += -L$(X11LIBS) -R$(X11LIBS)
这允许用户覆盖命令行上的X11LIBS(
make X11LIBS=/usr/local/X11R6/lib
),并在未提供用户选项的情况下尝试几个位置

如果找不到路径,甚至可以中止构建,如

 ifeq ($(X11LIBS),)
 $(error Could not find X11 library path, please specify in X11LIBS
 endif
如果您满足于限制Makefile的可移植性,那么所有这些都只是一个选项:非GNU make很可能对这些宏不满意