Tôi có một dự án cần xây dựng trên Windows, Linux và VxWorks. Dự án được xây dựng trên Linux và Windows nhưng được biên dịch chéo cho VxWorks. Để xử lý endianness trên nhiều nền tảng, nó sử dụng ntoh.h. Các máy Linux là ít endian nhưng ntohl không trao đổi trong chương trình của tôi.Linux: ntohl không hoạt động chính xác
Tôi đã viết chương trình thử nghiệm trực tiếp bao gồm in.h. Điều đó hoán đổi một cách thích hợp. Tôi đã viết một chương trình thử nghiệm khác chỉ bao gồm ntoh.h. Điều đó hoán đổi một cách thích hợp. Cả hai chương trình thử nghiệm đều liên kết với lib64/libc.so.6.
Tuy nhiên, khi tôi biên dịch dự án của mình, ntohl không trao đổi. Tôi không thể phá vỡ ntohl bằng cách sử dụng lệnh gdb "break ntohl". Khi xây dựng, tôi thấy LITTLE ENDIAN cảnh báo (xem bên dưới) và không thấy các lỗi "NÊN NÊN CÓ ĐÂY".
Vui lòng trợ giúp. Tôi không hiểu tại sao vấn đề này lại xảy ra.
Dưới đây là 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__
Một phần của lệnh biên dịch của tôi:
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 ...
Các lỗi được tạo ra bởi những dòng sau:
int deadbeef = 0xDEADBEEF;
printf("TESTING DEADBEEF %x %x\n", deadbeef, ntohl(deadbeef));
Kết quả của những hai dòng sản xuất cùng một đầu ra. KIỂM TRA DEADBEEF deadbeef deadbeef
Vui lòng thêm mã thực sự không hoạt động chính xác. – wRAR
Từ bản chỉnh sửa của bạn, làm thế nào có thể 'printf ("% x ", 0xdeadbeef)' tạo 'efbeadde'? Bạn có thể muốn đăng một ví dụ tối thiểu hiển thị mã thực của bạn. –
@AustinPhillips: Rất tiếc, bạn đã đúng.Mô tả đầu ra đã được sửa. – Kat