Linux:nohl无法正常工作
Linux: ntohl does not work correctly
我有一个项目需要在Windows、Linux和VxWorks上构建。该项目构建在Linux和Windows上,但为VxWorks进行了交叉编译。为了处理跨多个平台的端序,它使用了ntoh.h。Linux机器是小端序,但ntohl在我的程序中不交换。
我写了一个直接包含在.h中的测试程序。我写了另一个测试程序,其中只包含了ntoh.h。两个测试程序都链接到lib64/libc.so.6。
然而,当我编译我的项目时,ntohl不会交换。我无法使用gdb"break ntohl"命令来破解ntohl。建造时,我看到小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 %xn", 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 %xn", deadbeef, ntohl(deadbeef));
return 0;
}
TESTING DEADBEEF deadbeef efbeadde
这是否产生了预期的结果?
- 不:你的工具链和收割台坏了
- 是的:您的工具链是可以的,但您的实际代码与示例有所不同
通过预处理器gcc -dD -E -DLINUX ntoh.cpp
运行代码,并查看ntohl
宏扩展到什么,以及它来自哪里
我的猜测是,你的标题中有一些愚蠢的东西,例如
#undef ntohl
#define ntohl(x) (x)
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程