【问题标题】:How to disable C compiler in C++ Autotools project如何在 C++ Autotools 项目中禁用 C 编译器
【发布时间】:2018-04-14 01:46:53
【问题描述】:

我正处于将 Autotools 支持添加到 C++ 库的早期阶段。此时我正在使用以下配置运行autoreconf

$ cat Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS=cryptest

$ cat configure.ac
AC_INIT(Crypto++, 6.0, http://www.cryptopp.com/wiki/Bug_Report)
AM_INIT_AUTOMAKE
AC_PROG_CXX
AC_CONFIG_FILES([Makefile])

它正在生产:

$ autoreconf --install --force
/usr/share/automake-1.15/am/depend2.am: error: am__fastdepCC does not appear in AM_CONDITIONAL
/usr/share/automake-1.15/am/depend2.am:   The usual way to define 'am__fastdepCC' is to add 'AC_PROG_CC'
/usr/share/automake-1.15/am/depend2.am:   to 'configure.ac' and run 'aclocal' and 'autoconf' again
Makefile.am: error: C source seen but 'CC' is undefined
Makefile.am:   The usual way to define 'CC' is to add 'AC_PROG_CC'
Makefile.am:   to 'configure.ac' and run 'autoconf' again.
autoreconf: automake failed with exit status: 1

我正在尝试先解决 error: C source seen but 'CC' is undefined 问题。

基于邮件列表阅读的传统智慧是添加AC_PROG_CC 来解决此问题。我真的不想解决 C++ 标志将导致 C 编译器的问题,尤其是在像 IBM 的 xlc 和 Sun 的 cc 这样的编译器上。考虑到 GNU 完全是关于用户选择,这似乎也是错误的。

我如何告诉 Autotools 这个项目是一个 C++ 项目,它不应该用 C 或 C 编译器做任何事情?


这是它导致的一些问题。

$ egrep 'CC|CFLAGS' Makefile
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
...
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(AM_CFLAGS) $(CFLAGS)
...
CCLD = $(CC)
...
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \

$ autoreconf --version
autoreconf (GNU Autoconf) 2.69

$ autoconf --version
autoconf (GNU Autoconf) 2.69

$ automake --version
automake (GNU automake) 1.15

【问题讨论】:

  • 也许弄清楚为什么会出现错误消息。有关示例,请参见 lists.gnu.org/archive/html/automake/2003-01/msg00053.html
  • 这是一个类似的问题,反过来:gnu-automake.7480.n7.nabble.com/…
  • 谢谢奥拉夫。 ls *.c 导致 ls: cannot access '*.c': No such file or directory;和ls -1 *.cpp | wc -l 导致155。 (对我来说)为什么 Autotools 想要一个 C 编译器来做任何事情都是一个谜。
  • 他们的 C++ 宏可能仍在搜索 cfront 类型的编译器,如果不搜索 C 编译器会出现问题。

标签: c++ autotools autoconf


【解决方案1】:

当您定义像 bin_PROGRAMS=cryptest 这样的程序时,automake 会查找 cryptest_SOURCES 以找出 cryptest 的源文件。如果您没有定义cryptest_SOURCES,automake 将通过在程序名称后附加“.c”(默认)自动生成一个,例如好像你已经定义了cryptest_SOURCES=cryptest.c。要覆盖默认值,您可以显式定义每个程序的源,例如cryptest_SOURCES=cryptest.cpp,或者您可以定义 AM_DEFAULT_SOURCE_EXT=.cpp 以使所有自动生成的源文件名以“.cpp”而不是“.c”结尾。

当然,如果您的源名称与程序名称不匹配,或者有多个源(包括您希望通过“make dist”包含的任何头文件),无论如何您都需要显式定义,例如cryptest_SOURCES=cryptest.cpp cryptest-part2.cpp cryptest.h.

见:https://www.gnu.org/software/automake/manual/automake.html#Default-_005fSOURCES

编辑添加:假设您将使用 AC 宏来测试编译器的功能,您将需要首先调用 AC_LANG([C++])(在 AC_PROG_CXX 之后)告诉 autoconf 它应该测试 C++编译器,而不是 C 编译器。

【讨论】:

  • 呃,谢谢肯。不幸的是,这并没有奏效。生成的makefile包括CC = gccCFLAGS =。我什至尝试在我的configure.ac 中使用sedAC_CONFIG_COMMANDS 中删除它。没有快乐。
  • 谢谢肯。很抱歉,我仍然是witnessing the issue。查看 makefile 它正在做我想要避免的事情:它通过CC 链接,而不是CXX。我猜 Autoconf 的人从来没有真正测试过 C++ 项目。否则它会像拇指酸痛一样伸出并被修复。我尝试CC=/dev/null,但它只是破坏了一些东西。
  • 我猜这不能通过我的解决方法来解决。我会接受,因为你在这个问题上花了这么多时间。如果你想尝试真正的项目,可以在cryptopp-autotools找到。它已应用您的更改。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 2015-03-28
  • 2010-11-15
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多