【问题标题】:How should I link libraries in automake normally linked with pkg-config?我应该如何链接 automake 中通常与 pkg-config 链接的库?
【发布时间】:2016-04-19 02:12:48
【问题描述】:

我正在尝试使用 automake 构建我的项目。特别是在使用 Allegro5 时。

我可以使用以下命令构建我的代码

g++ -std=c++0x *.cpp -o mygame $(pkg-config --libs allegro-5.0 \
allegro_acodec-5.0 allegro_audio-5.0 allegro_color-5.0 allegro_dialog-5.0 \
allegro_font-5.0 allegro_image-5.0 allegro_main-5.0 allegro_memfile-5.0 \
allegro_physfs-5.0 allegro_primitives-5.0 allegro_ttf-5.0)

但我的 Makefile 将无法工作。

这是我的 src/Makefile.am

bin_PROGRAMS = mygame

AM_CXXFLAGS = "-std=c++0x"

mygame_SOURCES = Animation.cpp Body.cpp GameObject.cpp Menu.cpp Vector3.cpp \
    Arena.cpp Button.cpp Keyboard.cpp Mesh.cpp Assets.cpp Character.cpp \
    main.cpp Mouse.cpp Barrier.cpp Environment.cpp Manager.cpp TitleMenu.cpp

mygame_LDADD = allegro-5.0 allegro_acodec-5.0 allegro_audio-5.0 \
    allegro_color-5.0 allegro_dialog-5.0 allegro_font-5.0 allegro_image-5.0 \
    allegro_main-5.0 allegro_memfile-5.0 allegro_physfs-5.0 \
    allegro_primitives-5.0 allegro_ttf-5.0

CLEANFILES = mygame *.o

这是我的 configure.ac

AC_INIT(bayou, 0.1.0)
AM_INIT_AUTOMAKE

AC_LANG_CPLUSPLUS
AC_PROG_CXX
LT_INIT

AC_OUTPUT(
    Makefile \
    src/Makefile\
)

运行我的第一个命令就可以了。运行 make 给了我

make: *** No rule to make target `allegro-5.0', needed by 'mygame'.  Stop.

那么我应该如何设置我的 configure.ac 和 Makefile.am,以便我可以使用通常与 pkg-config 链接的库?

【问题讨论】:

  • 我想我发现了如何使用 -L 和 -lallegro 设置命令。我需要运行pkg-config --libs allegro-5.0 allegro_acodec-5.0 allegro_audio-5.0 allegro_color-5.0 llegro_dialog-5.0 allegro_font-5.0 allegro_image-5.0 allegro_main-5.0 allegro_memfile-5.0 allegro_physfs-5.0 allegro_primitives-5.0 allegro_ttf-5.0 来获取库列表,然后我将按照这个问题的答案进行操作。不过,当我下班回家时,我将不得不这样做。 stackoverflow.com/questions/6560760/…

标签: makefile autoconf automake allegro5


【解决方案1】:

pkg-config 可以动态地告诉您要使用哪些路径/标志。 它旨在动态地使用,而不是在您的开发机器上运行它,然后将其复制“n”粘贴到 makefile 中,然后期望它在任何部署机器上运行。

这是更新后的Makefile.am,基于您自己的回答:

bin_PROGRAMS = mygame
AM_CXXFLAGS = "-std=c++0x"

PKGLIBS=allegro-5.0 \
    allegro_acodec-5.0 allegro_audio-5.0 allegro_color-5.0 allegro_dialog-5.0 \
    allegro_font-5.0 allegro_image-5.0 allegro_main-5.0 allegro_memfile-5.0 \
    allegro_physfs-5.0 allegro_primitives-5.0 allegro_ttf-5.0
mygame_CXXFLAGS = $(shell pkg-config --cflags $(PKGLIBS)) $(AM_CXXFLAGS)
mygame_LDADD = $(shell pkg-config --libs $(PKGLIBS))


mygame_SOURCES = Animation.cpp Body.cpp GameObject.cpp Menu.cpp Vector3.cpp \
    Arena.cpp Button.cpp Keyboard.cpp Mesh.cpp Assets.cpp Character.cpp \
    main.cpp Mouse.cpp Barrier.cpp Environment.cpp Manager.cpp TitleMenu.cpp

可能是在您的设置中,整个 allegro-foo 不需要任何特殊的编译器标志,但它也可能需要一些。因此,我的示例还为您的程序设置了编译器标志 (mygame_CXXFLAGS)。 最后,它摆脱了不需要的CLEANFILES

另外,您可以使用 autotools 路线,并在您的 configure.ac 中使用 PKG_CHECK_MODULES

【讨论】:

  • 感谢您的提示。我下班回家试试看。
【解决方案2】:

我的建议奏效了。我不必修改我的 configure.ac(虽然我可能应该这样我可以验证预期的软件包是否已安装)

无论如何,我在终端窗口中运行了pkg-config <insert libs from comment here>,它给出了以下输出

-L/usr/local/lib -lallegro_acodec -lallegro_audio -lallegro_color 
-lallegro_dialog -lallegro_image -lallegro_main -lallegro_memfile 
-lallegro_physfs -lallegro_primitives -lallegro_ttf -lallegro_font
-lallegro

所以我的新 Makefile.am 看起来像

bin_PROGRAMS = mygame

AM_CXXFLAGS = "-std=c++0x"

mygame_SOURCES = Animation.cpp Body.cpp GameObject.cpp Menu.cpp Vector3.cpp \
    Arena.cpp Button.cpp Keyboard.cpp Mesh.cpp Assets.cpp Character.cpp \
    main.cpp Mouse.cpp Barrier.cpp Environment.cpp Manager.cpp TitleMenu.cpp

mygame_LDADD = -Lusr/local/lib -lallegro_acodec \
    -lallegro_audio -lallegro_color -lallegro_dialog -lallegro_image \
    -lallegro_main -lallegro_memfile -lallegro_physfs -lallegro_primitives \
    -lallegro_ttf -lallegro_font -lallegro

CLEANFILES = mygame *.o

我要感谢学院和我的父母陪伴我度过这段艰难的时光。他们对我来说意义重大! *飞吻

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多