我是 C 和 Automake 开发的新手。所以这可能是一个愚蠢的问题。
我最近正在开发一个链接到 GLib 和 GObject 的 C 库。我的 Makefile.am 和 configure.ac 正在编译过程中。但是,当我尝试编译单元测试时,出现了一系列错误。错误类似于:
src/.libs/libfoobar.so: undefined reference to `g_intern_static_string'
src/.libs/libfoobar.so: undefined reference to `g_once_init_enter'
src/.libs/libfoobar.so: undefined reference to `g_free'
src/.libs/libfoobar.so: undefined reference to `g_once_init_leave'
src/.libs/libfoobar.so: undefined reference to `g_type_name'
src/.libs/libfoobar.so: undefined reference to `g_value_set_string'
src/.libs/libfoobar.so: undefined reference to `g_type_class_adjust_private_offset'
src/.libs/libfoobar.so: undefined reference to `g_return_if_fail_warning'
src/.libs/libfoobar.so: undefined reference to `g_object_new'
src/.libs/libfoobar.so: undefined reference to `g_type_class_peek_parent'
src/.libs/libfoobar.so: undefined reference to `g_param_spec_string'
src/.libs/libfoobar.so: undefined reference to `g_type_check_class_cast'
src/.libs/libfoobar.so: undefined reference to `g_type_class_add_private'
src/.libs/libfoobar.so: undefined reference to `g_type_register_static_simple'
src/.libs/libfoobar.so: undefined reference to `g_log'
src/.libs/libfoobar.so: undefined reference to `g_value_dup_string'
src/.libs/libfoobar.so: undefined reference to `g_type_instance_get_private'
src/.libs/libfoobar.so: undefined reference to `g_object_class_install_properties'
collect2: error: ld returned 1 exit status
我应该从哪里开始寻找来解决这个问题?
我的项目的更多信息:
目录结构
- /
- src/
- foobar-hello.c
- foobar-hello.h
- 测试/
- 测试-foobar-hello.c
- Makefile.am
- configure.ac
- autogen.sh
- README.md
- src/
Autotools相关文件
Makefile.am
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
AUTOMAKE_OPTIONS = subdir-objects
# -- Common build flags --------------
AM_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/src
# -- Library -------------------------
lib_LTLIBRARIES = src/libfoobar.la
src_libfoobar_la_SOURCES = \
src/foobar-hello.c \
$(NULL)
src_libfoobar_la_include_HEADERS = \
src/foobar-hello.h \
$(NULL)
src_libfoobar_la_includedir = $(includedir)/foobar
# -- Tests ---------------------------
check_PROGRAMS = \
tests/test_foobar_hello \
$(NULL)
tests_test_foobar_hello_SOURCES = tests/test-foobar-hello.c
tests_test_foobar_hello_LDADD = src/libfoobar.la
TESTS = $(check_PROGRAMS)
# -- Common --------------------------
CLEANFILES = \
$(NULL)
EXTRA_DIST = \
autogen.sh \
README.md \
$(NULL)
configure.ac
AC_PREREQ(2.63)
AC_INIT([libfoobar], [0.1], [https://github.com/foobar/libfoobar/issues], [libfoobar], [https://github.com/foobar/libfoobar])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar foreign])
AC_PROG_MKDIR_P
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
# Check library versions
# then substitute the revelant cflag with actual library information
PKG_CHECK_MODULES([GLIB],[glib-2.0 > 2.19.0])
AC_SUBST(GLIB_CFLAGS)
# Initialize libtool
LT_INIT([disable-static])
# OUTPUT files
AC_CONFIG_FILES([
Makefile
])
AC_OUTPUT
编辑:
解决方案
阅读后ldavis的有用答案,这是我所做的:
我在
configure.ac
中添加了这两行:PKG_CHECK_MODULES([GOBJECT],[gobject-2.0]) AC_SUBST(GOBJECT_CFLAGS)
我更改了
Makefile.am
中的AM_CFLAGS
行:AM_CFLAGS = $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) -I$(top_srcdir)/src
我将此行添加到
Makefile.am
:src_libfoobar_la_LIBADD = $(GLIB_LIBS) $(GOBJECT_LIBS)
它就像一个魅力。
最佳答案
您应该首先仔细查看错误:
collect2: error: ld returned 1 exit status
这告诉您这是一个链接器错误(ld
是链接器)。
src/.libs/libfoobar.so: undefined reference to `g_intern_static_string'
链接器在您链接到测试程序的src/.libs/libfoobar.so
(共享库)中找不到符号。因此 src/.libs/libfoobar.so 可能至少缺少一个依赖库,但可能缺少两个依赖库(前面提到的 libglib 和 libgobject) )。它们需要链接到libfoobar.so
。
现代版本的 PKG_CHECK_MODULES
宏应该为 AC_SUBST
foo_LIBS
和 foo_CFLAGS
变量(例如 GLIB_LIBS
和 GLIB_CFLAGS
)。需要将其添加到 Makefile 中以链接 libglib
:
Makefile.am
src_libfoobar_la_LDADD = $(GLIB_LIBS)
这仍然不会链接您的测试代码,但您的错误应该会减少。您需要在 configure.ac
中对 libgobject
进行 PKG_CHECK_MODULES
,并插入相应的 GOBJECT_CFLAGS
和 GOBJECT_LIBS
位于 Makefile.am
中的正确位置。
关于autotools - Automake 配置无法编译我的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24197729/