libcheck 失败并显示 /usr/bin/ld:找不到@CHECK_CFLAGS@:没有这样的文件或目录

libcheck fails with /usr/bin/ld: cannot find @CHECK_CFLAGS@: No such file or directory

我正在尝试按照检查教程 here 尝试设置测试套件。我的项目结构是这样的

root
  |-----src
         |----- foo.h, foo.c
        test
         |----- root_test.h, root_test.c, foo_test.c
        Makefile.am
        configure.ac

我的foo.h:

#ifndef FOO_H
#define FOO_H

int func();

#endif

foo.c:

#include "foo.h"

int func() { return 0; }

root_test.h:

#ifndef ROOT_TEST_H
#define ROOT_TEST_H

#include <check.h>

Suite *foo_suite();

#endif

root_test.c:

#include <check.h>
#include <stdlib.h>

#include "root_test.h"

int main() {
  int fc;
  SRunner *sr;

  sr = srunner_create(foo_suite());

  srunner_run_all(sr, CK_NORMAL);
  fc = srunner_ntests_failed(sr);
  srunner_free(sr);

  return fc == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

foo_test.c:

#include <check.h>

#include "../src/foo.h"
#include "root_test.h"

START_TEST(foo_func) { ck_assert_int_eq(func(), 0); }
END_TEST

Suite *foo_suite() {
  Suite *s;
  TCase *tc;

  s = suite_create("Foo");
  tc = tcase_create("Core");

  tcase_add_test(tc, foo_func);

  suite_add_tcase(s, tc);
  return s;
}

我的Makefile.am:

ACLOCAL_AMFLAGS = -I m4

lib_LTLIBRARIES = libroot.la

HFILES =\
  src/foo.h       

CFILES =\
  src/foo.c

libroot_la_SOURCES = $(HFILES) $(CFILES)

TESTS = libroot_test
check_PROGRAMS = libroot_test
libroot_test_SOURCES = $(HFILES) test/root_test.h test/root_test.c test/foo_test.c
libroot_test_CFLAGS = @CHECK_CFLAGS@
libroot_test_LDADD = libroot.la @CHECK_LIBS@

noinst_PROGRAMS = libroot_test

和我的 configure.ac:

AC_PREREQ([2.71])
AC_INIT([libroot], [0.0.1], [swdon@users.noreply.github.com])
AC_CONFIG_AUX_DIR([build])
AC_CONFIG_MACRO_DIRS([m4])
AC_CONFIG_SRCDIR([src/foo.h])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AM_PROG_AR

LT_INIT

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_REALLOC

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

我的 autoreconf -i./configure 运行 没有任何问题。当我 运行 make check 我得到以下错误输出:

/bin/sh ./libtool  --tag=CC   --mode=link gcc @CHECK_CFLAGS@ -g -O2   -o libroot_test  test/libroot_test-libroot_test.o test/libroot_test-foo_test.o libroot.la @CHECK_LIBS@ 
libtool: link: gcc @CHECK_CFLAGS@ -g -O2 -o .libs/libroot_test test/libroot_test-libroot_test.o test/libroot_test-foo_test.o @CHECK_LIBS@  ./.libs/libroot.so -Wl,-rpath -Wl,/usr/local/lib
/usr/bin/ld: cannot find @CHECK_CFLAGS@: No such file or directory
/usr/bin/ld: cannot find @CHECK_LIBS@: No such file or directory
collect2: error: ld returned 1 exit status
make: *** [Makefile:687: libroot_test] Error 1

好的,所以我将 AM_PATH_CHECK 添加到我的 configure.ac 中,现在可以使用了。我的更新 configure.ac:

AC_PREREQ([2.71])
AC_INIT([libccg],[0.0.1],[smadurange@users.noreply.github.com])
AC_CONFIG_AUX_DIR([build])
AC_CONFIG_MACRO_DIRS([m4])
AC_CONFIG_SRCDIR([src/foo.h])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AM_PROG_AR
AM_PATH_CHECK

LT_INIT

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_REALLOC

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

您的 Makefile.am 中出现的 @CHECK_CFLAGS@@CHECK_LIBS@ 字符串是 Autoconf 输出变量值的占位符,但您的原始 configure.ac 不包含任何可能设置这样的输出变量。因此,占位符会在生成的 makefile 中保持不变,并导致构建失败并出现观察到的错误。

Check 文档包含 a section about integrating libcheck with Autotools-based build systems。它的推荐是使用pkg-config提供的PKG_CHECK_MODULES。例如,

# ...

# Checks for libraries.
PKG_CHECK_MODULES([CHECK], [check >= 0.9.6])

# ...

第二个宏参数指定Check可接受的最低版本,如果不想指定最低版本可以省略。

另请注意,PKG_CHECK_MODULES 的旧版本不会自动生成相关变量 Autoconf 输出变量。如果你背负着这样的版本而无法更新,那么你也想添加

AC_SUBST([CHECK_CFLAGS])
AC_SUBST([CHECK_LIBS])

PKG_CHECK_MODULES 之后。

如果您没有 pkg-config 或者不希望您的包构建依赖于它,那么 Check 本身提供的 AM_PATH_CHECK() 宏也可以达到目的。然而,该宏已被弃用,因此可能会从 Check 的某些未来版本中删除。有关此宏的更多信息,请参阅文档。