у меня есть .cpp
файл: htonstest.cpp
, я использую g++
скомпилировать это:
$ g++ -o test htonstest.cpp
Работает и программа ./test
тоже работает
Но когда я использую automake для компиляции, возникает ошибка компиляции:
htonstest.cpp: In function ‘int main()’:
htonstest.cpp:6: error:expected id-expression before ‘(’ token.
Моя ОС — CentOS, версия gcc — 4.1.2, 20080704, версия autoconf — 2.59, версия automake — 1.9.6.
Воспроизвести:
$ 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
Это на самом деле не связано с автоинструментами, и я был весьма удивлен, когда тестировал вашу программу. Соответствующий код находится в netinet/in.h
…
#ifdef __OPTIMIZE__
...
# define ntohs(x) ...
...
#endif
Причиной сбоя кода в Automake является то, что Automake по умолчанию -O2
, и когда -O2
включен, ntohs()
это макрос.
использование ntohs(3)
вместо ::ntohs(3)
,
Добавьте следующую строку после ваших включений:
#undef ntohs
byteorder(3)
man-страница гласит:
htons()
функция преобразует короткое целое без знакаhostshort
от порядка байтов хоста к порядку байтов сети.
Так что, на мой взгляд, это в лучшем случае грубый для библиотеки, чтобы определить htons()
макро.
Других решений пока нет …