我应该如何 link automake 中的库正常地 linked with pkg-config?
How should I link libraries in automake normally linked with pkg-config?
我正在尝试使用 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 以便我可以使用通常 link 和 pkg-config 的库?
我的建议奏效了。我不必修改我的 configure.ac(尽管我可能应该修改我可以验证预期的软件包是否已安装)
无论如何,我 运行 pkg-config <insert libs from comment here>
在终端 window 中给出了以下输出
-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
我要感谢学院和我的 parents 陪伴我度过这段艰难的时光。他们对我来说意义重大! *飞吻
pkg-config
会动态地告诉您要使用哪个 paths/flags。
它旨在 动态使用 ,而不是 运行 在您的开发机器上使用它,然后将其复制'n'粘贴到 makefile 中,然后期望它成为 [=29] =] 在任何部署机器上。
这是根据您自己的回答更新的 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
宏
我正在尝试使用 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 以便我可以使用通常 link 和 pkg-config 的库?
我的建议奏效了。我不必修改我的 configure.ac(尽管我可能应该修改我可以验证预期的软件包是否已安装)
无论如何,我 运行 pkg-config <insert libs from comment here>
在终端 window 中给出了以下输出
-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
我要感谢学院和我的 parents 陪伴我度过这段艰难的时光。他们对我来说意义重大! *飞吻
pkg-config
会动态地告诉您要使用哪个 paths/flags。
它旨在 动态使用 ,而不是 运行 在您的开发机器上使用它,然后将其复制'n'粘贴到 makefile 中,然后期望它成为 [=29] =] 在任何部署机器上。
这是根据您自己的回答更新的 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
宏