autotools - Automake 配置无法编译我的单元测试

标签 autotools glib automake gobject

我是 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

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的有用答案,这是我所做的:

  1. 我在 configure.ac 中添加了这两行:

    PKG_CHECK_MODULES([GOBJECT],[gobject-2.0])
    AC_SUBST(GOBJECT_CFLAGS)
    
  2. 我更改了 Makefile.am 中的 AM_CFLAGS 行:

    AM_CFLAGS = $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) -I$(top_srcdir)/src
    
  3. 我将此行添加到 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_LIBSfoo_CFLAGS 变量(例如 GLIB_LIBSGLIB_CFLAGS)。需要将其添加到 Makefile 中以链接 libglib:

Makefile.am

src_libfoobar_la_LDADD = $(GLIB_LIBS)

这仍然不会链接您的测试代码,但您的错误应该会减少。您需要在 configure.ac 中对 libgobject 进行 PKG_CHECK_MODULES,并插入相应的 GOBJECT_CFLAGSGOBJECT_LIBS 位于 Makefile.am 中的正确位置。

关于autotools - Automake 配置无法编译我的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24197729/

相关文章:

c - 使用带文件扩展名 .r 的 autotools 作为 header ,不是 ratfor,而是 C 编程

autotools - 在配置运行期间运行脚本

c - Autotools:将 -D 与变量一起使用适用于除一次编译以外的所有编译(C 编程)

c++ - Autotools 和 OpenSSL MD5/RAND_bytes 未定义

c - 在GIO中,为什么这些异步文件IO操作永远不会完成? (适用于 C 和 Vala)

c - 在 glib 库中,我不明白为什么 union data[2] 的 struct _GValue 有 2 个元素?

c - 如何使用 glib 逐行读取 unicode 文件

c++ - 如何通过 GNU Autotools 链接共享库

c++ - 是否可以为 DLL/SO 构建指定特定标志/定义?

c++ - 在通用 Linux 上构建 sipXtapi - 安装错误