Autotools 将库标志添加到 ar

Autotools adds library flags to ar

我目前正在移植我的 C++ 项目以使用 GNU autotools 工具链,但我在设置我的库依赖项时遇到了问题。似乎正在发生的事情是它为命令提供了 ar 用于 g++ 的标志,例如 -lSDL2 -L/usr/local/lib -lSDL2_image -lSDL2.

这是 src/Makefile.am 的代码:

noinst_LIBRARIES = libccade.a
libccade_a_SOURCES = CCade.h CCade_graphics.h CCade_graphics.cpp CCade_util.h CCade_util.cpp
libccade_a_LIBADD = $(libsdl2_LIBS) $(libsdl2_image_LIBS)
libccade_a_CFLAGS = $(libsdl2_CFLAGS) $(libsdl2_image_CFLAGS)

make 的内容如下:

ar cru libccade.a CCade_graphics.o CCade_util.o -lSDL2 -L/usr/local/lib -lSDL2_image -lSDL2
ar: invalid option -- 'L'
Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...
...(more documentation on ar)...

它似乎正在添加来自 libccade_a_LIBADD 的参数,但如果我删除该变量,则它不会将标志提供给 g++。我该怎么办?

您似乎没有使用 libtool。我通常做的是把这个放在我的 configure.ac:

AM_PROG_LIBTOOL

然后我的 Makefile.am 会是这样的:

noinst_HEADERS = CCade.h CCade_graphics.h CCade_util.h

noinst_LTLIBRARIES = libccade.la

libccade_la_SOURCES = CCade_graphics.cpp CCade_util.cpp
libccade_la_LIBADD = $(libsdl2_LIBS) $(libsdl2_image_LIBS)
libccade_la_CPPFLAGS = $(libsdl2_CFLAGS) $(libsdl2_image_CFLAGS)

确保第二个变量是 noinst_LTLIBRARIES,它应该适合你。

您希望这条线做什么?:

libccade_a_LIBADD = $(libsdl2_LIBS) $(libsdl2_image_LIBS)

ar 不做任何链接,它不关心其他库,所以这里没有必要指定它们。