I have a .cpp
file: htonstest.cpp
. I use g++
to compile it:
$ g++ -o test htonstest.cpp
It works, and the program ./test
works too.
But, when I use automake to compile it, has a compile error:
htonstest.cpp: In function ‘int main()’:
htonstest.cpp:6: error:expected id-expression before ‘(’ token.
My OS is CentOS, gcc's version is 4.1.2 20080704, autoconf's version is 2.59, automake's version is 1.9.6.
To reproduce:
$ aclocal
$ autoheader
$ autoconf
$ automake -a
$ ./configure
$ make
ntohstest.cpp:
#include <netinet/in.h>
#include <iostream>
int main()
{
short a = ::ntohs(3);
std::cout << a << std::endl;
std::cin.get();
return 0;
}
configure.ac:
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([htonstest.cpp])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE([foreign])
# Checks for programs.
AC_PROG_CXX
# Checks for libraries.
# Checks for header files.
# AC_CHECK_HEADERS([netinet/in.h])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
Makefile.am:
bin_PROGRAMS=main
main_SOURCES=htonstest.cpp
This is actually unrelated to autotools, and I was quite surprised when I tested your program. The relevant code is in netinet/in.h
...
#ifdef __OPTIMIZE__
...
# define ntohs(x) ...
...
#endif
The reason that the code fails under Automake is because Automake defaults to -O2
, and when -O2
is enabled, ntohs()
is a macro.
Use ntohs(3)
instead of ::ntohs(3)
.
Add the following line after your includes:
#undef ntohs
The byteorder(3)
manpage reads:
The
htons()
function converts the unsigned short integerhostshort
from host byte order to network byte order.
So in my opinion, it is at best rude for the library to define an htons()
macro.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With