2013-02-25 103 views
5

मेरे पास एक प्रोजेक्ट है जिसे विंडोज, लिनक्स और वीक्सवर्क्स पर निर्माण करने की आवश्यकता है। परियोजना लिनक्स और विंडोज पर बनाई गई है लेकिन VxWorks के लिए संकलित क्रॉस। कई प्लेटफार्मों में अंतहीनता को संभालने के लिए, यह ntoh.h का उपयोग करता है। लिनक्स मशीन थोड़ा एंडियन है लेकिन ntohl मेरे प्रोग्राम में स्वैप नहीं करता है।लिनक्स: ntohl सही ढंग से काम नहीं करता

मैंने एक परीक्षण कार्यक्रम लिखा जिसमें सीधे शामिल है.h.h। वह उचित रूप से स्वैप करता है। मैंने एक और परीक्षण कार्यक्रम लिखा जिसमें सिर्फ ntoh.h शामिल है। वह उचित रूप से स्वैप करता है। दोनों परीक्षण कार्यक्रम lib64/libc.so.6 से लिंक हैं।

हालांकि, जब मैं अपनी परियोजना संकलित करता हूं, तो ntohl स्वैप नहीं करता है। मैं gdb "break ntohl" कमांड का उपयोग कर ntohl पर नहीं तोड़ सकता। निर्माण करते समय, मुझे लिटल एंडियन चेतावनी (नीचे देखें) देखें और "यहां होना चाहिए" त्रुटि देखें।

कृपया मदद करें। मुझे समझ में नहीं आता कि यह समस्या क्यों हो रही है।

#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__ 

मेरी संकलन आदेश का एक हिस्सा:

नीचे ntoh.h है

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)); 

उन लोगों से उत्पादन दो लाइनें एक ही आउटपुट का उत्पादन करती हैं। परीक्षण डेडबीफ डेडबीफ डेडबीफ

+2

कृपया उस कोड को जोड़ें जो वास्तव में सही तरीके से काम नहीं करता है। – wRAR

+1

आपके संपादन से, यह कैसे संभव है कि 'printf ("% x", 0xdeadbeef) 'efbeadde' का उत्पादन करता है? आप अपना असली कोड दिखाकर एक न्यूनतम उदाहरण पोस्ट करना चाहेंगे। –

+0

@ ऑस्टिन फिलिप्स: क्षमा करें, आप सही हैं।आउटपुट का विवरण तय किया गया था। – Kat

उत्तर

6

उन दो लाइनों का आउटपुट एक ही आउटपुट उत्पन्न करता है। परीक्षण DEADBEEF deadbeef 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) 
+0

ये झंडे सिर्फ वही हैं जो मुझे चाहिए। मेरा सॉफ़्टवेयर एक stale ntoh.h फ़ाइल को कॉल कर रहा था जिसमें ** त्रुटि शामिल नहीं थी ** और ** LINUX ** परिभाषा जांच नहीं होनी चाहिए। Stale फ़ाइल ntohl (x) को परिभाषित कर रहा था (x)! मैंने सही ढंग से साफ करने के लिए अपना मेकफ़ाइल अपडेट किया। पुरानी फ़ाइल हटा दी गयी है। – Kat