我正在启动一个新项目。我想在我的构建系统中使用自动工具,并且该项目将链接到 SDL2。但是,我一直在写
configure.ac
文件。
在系统上安装 SDL2 时链接到 SDL2 的记录方法使用输出链接器标志的已安装命令:
gcc -o myprogram myprogram.c `sdl2-config --cflags --libs`
我发现可以合理地假设
sdl2-config
的输出可能会根据系统而变化,并且它应该在configure中运行,然后传递给make(这可能是错误的!)。不过,我在尝试设置这个时遇到了困难。也许是因为我对 M4sh 的了解非常有限,但我不知道如何在目标计算机上进行命令替换。
如何正确地将链接 SDL2 和自动工具集成到项目中,为什么这样做,以便我可以将这些原则应用到我遇到此问题的未来库?
我发现可以合理地假设
的输出可能会根据系统而变化,sdl2-config
确实非常合理。
并且它应该在configure中运行,然后传递给make(这可能是错误的!)。
这对我来说似乎最合适。
不过,我在尝试设置这个时遇到了困难。也许是因为我对 M4sh 的了解非常有限,但我不知道如何在目标计算机上进行命令替换。
m4sh 宏有助于处理在 shell 实现之间表现出可移植性问题的 shell 功能,但许多 shell 功能足够兼容,因此在 m4sh 中没有特定支持。 如果您希望在
configure
脚本中使用其中之一,则只需在 configure.ac
中直接使用它即可。 命令替换就是这样一个功能。 然而,Autoconf 手册确实包含了关于可移植 shell 编程的一整章,其中有几句话是关于命令替换的(没有什么特别重要的)。
所以你正在寻找这样的东西:
配置.ac
# ...
# maybe also add a "checking" message and result, and fail if not found...
AC_PATH_PROG([SDL2_CONFIG], [sdl2-config])
# sdl2-config --cflags seems actually to output preprocessor flags, hence CPPFLAGS below:
SDL2_CPPFLAGS=$(${SDL2_CONFIG} --cflags)
SDL2_LIBS=$(${SDL2_CONFIG} --libs)
# Make those output variables:
AC_SUBST([SDL2_CPPFLAGS])
AC_SUBST([SDL2_LIBS])
# ...
然后...
Makefile.am
bin_PROGRAMS = myprogram
myprogram_SOURCES = myprogram.c
myprogram_CPPFLAGS = $(SDL2_CPPFLAGS)
myprogram_LDADD = $(SDL2_LIBS)