我有一个需要在Windows,Linux和VxWorks上构建的项目。该项目基于Linux和Windows构建,但针对VxWorks进行了交叉编译。要处理跨多个平台的字节序,它使用ntoh.h。 Linux机器的字节序很少,但是ntohl不在我的程序中交换。

我编写了一个直接包含in.h的测试程序。那适本地交换。
我编写了另一个包含ntoh.h的测试程序。那适本地交换。这两个测试程序都链接到lib64/libc.so.6。

但是,当我编译项目时,ntohl不会交换。我无法使用gdb“break ntohl”命令来中断ntohl。构建时,我看到 LITTLE ENDIAN 警告(见下文),看不到“SHOULDNT BE HERE” 错误。

请帮忙。我不明白为什么会发生此问题。

以下是ntoh.h:

#ifndef __ntoh__
#define __ntoh__

#include "basic_types.h"

#ifdef WIN32
    #include <winsock2.h>
#elif LINUX
    #include <netinet/in.h>

    //This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
    // Not in original code
    #if __BYTE_ORDER == __BIG_ENDIAN
    #warning BIG ENDIAN BYTE ORDER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    #endif

    //This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
    // Not in original code
    #if __BYTE_ORDER == __LITTLE_ENDIAN
    #warning YAY LITTLE ENDIAN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    #endif
#else

  #error SHOULDNT BE HERE     //added for debugging purposes
  #define ntohl(x)        (x)
  #define ntohs(x)        (x)
  #define htonl(x)        (x)
  #define htons(x)        (x)

#endif

#endif // __ntoh__

我的编译命令的一部分:
g++ -DDAU_PARSER -DNO_MT -DTEST_CLOCK -DLINUX  -g -Irelease/include -Irelease/include/Record_Data/ -Irelease/include/Utility -o dauParser DAU_Support_Tools/src/dau_parser.cpp DAU_Support_Tools/src/dau_parser_write_data_to_file.cpp Utility/src/Messaging/Communications/Message.cpp Utility/src/time_type.cpp Utility/src/collectable.cpp Utility/src/clist.cpp Utility/src/clock.cpp Utility/src/test_clock.cpp Utility/src/mutex.cpp Utility/src/ntoh.cpp ...

该错误是由以下几行生成的:
int deadbeef = 0xDEADBEEF;
printf("TESTING DEADBEEF %x %x\n", deadbeef, ntohl(deadbeef) );

这两条线的输出产生相同的输出。
测试死牛肉死牛肉死牛肉

最佳答案



好吧,出了点问题,但是我们不能告诉你什么。您必须调试此问题,因为您是唯一可以观察到此问题的人。

从最简单的示例开始:

cat t.c; gcc t.c && ./a.out
#include <netinet/in.h>
#include <stdio.h>

int main() {
  int deadbeef = 0xDEADBEEF;
  printf("TESTING DEADBEEF %x %x\n", deadbeef, ntohl(deadbeef));
  return 0;
}


TESTING DEADBEEF deadbeef efbeadde

这产生了预期的结果吗?
  • 否:您的工具链和标题已损坏。
  • 是:您的工具链还可以,但是您的实际代码与示例有所不同。
    通过预处理器gcc -dD -E -DLINUX ntoh.cpp运行代码,并查看ntohl宏扩展到的内容以及其来源。

  • 我的猜测是您的标题之一中有一些愚蠢的内容,例如
    #undef ntohl
    #define ntohl(x) (x)
    

    关于c++ - Linux:ntohl无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15076977/

    10-13 05:08