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 的某些未来版本中删除。有关此宏的更多信息,请参阅文档。
我正在尝试按照检查教程 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 的某些未来版本中删除。有关此宏的更多信息,请参阅文档。