6

ファイルがあり.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.

私の OS は 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
4

1 に答える 1

11

これは実際には autotools とは関係ありません。あなたのプログラムをテストしたとき、私はかなり驚きました。関連するコードはnetinet/in.h...

#ifdef __OPTIMIZE__
...
# define ntohs(x) ...
...
#endif

Automake でコードが失敗する理由は、Automake のデフォルトが-O2であり、-O2が有効になっている場合はntohs()マクロであるためです。

修正

ntohs(3)の代わりに使用し::ntohs(3)ます。

代替修正

インクルードの後に​​次の行を追加します。

#undef ntohs

ドキュメンテーション

byteorder(3)マンページには次のように書かれています。

この関数は、符号なし短整数をホスト バイト オーダーからネットワーク バイト オーダーにhtons()変換します。hostshort

したがって、私の意見では、ライブラリがマクロを定義することはせいぜい失礼です。htons()

于 2013-01-21T02:45:19.413 に答える