2015-11-06 10 views
5

में जीसीसी लिंकर त्रुटियों को नहीं पहचानता है हमारे पास एक क्रॉस संकलित दृश्य स्टूडियो मेकफ़ाइल प्रोजेक्ट है। कंपाइलर त्रुटियों को पहचानने के लिए हमें पहले से ही solution similar to this पेश करना पड़ा है। अर्थात। हमने जीसीसी से आउटपुट को पार्स करने के लिए एक पर्ल लिपि पेश की है और इसे एक ऐसे रूप में रूपांतरित किया है जो विजुअल स्टूडियो समझ जाएगा। अगर हम घोषणा करते हैं:विजुअल स्टूडियो मेकफ़ाइल प्रोजेक्ट

int succ = thisRandomFunction(userPointer, 1, 1); 

thisRandomFunction के लिए कोई परिभाषा के साथ तो हम लिंकर त्रुटि प्राप्त होगी:

1> ./program.a(taskqueue.o): In function `TaskQueueAdd': 1> 
D:\Git\program\taskqueue.c(94,1) : undefined reference to `thisRandomFunction' 1> 
collect2: ld returned 1 exit status 1> make: *** [program.exe] Error 1 

लेकिन दृश्य स्टूडियो वास्तव में एक त्रुटि के रूप में नहीं मानता। एक ही समस्या के साथ एक दृश्य स्टूडियो सी ++ सांत्वना कार्यक्रम संयोजक त्रुटि है: इस

में

1> d:\Git\program/taskqueue.c:94: undefined reference to `thisRandomFunction' 

:

sub parseLinkerError 
{ 
    my $str = $_[0]; 
    my $find = "undefined reference to"; 
    my $replace = "error LNK2019: unresolved external symbol"; 
    $str =~ s/$find/$replace/g; 
    return $str 
} 

हम इस परिवर्तित कर सकते हैं:

1> TestUndefinedReference.cpp 
1>TestUndefinedReference.obj : error LNK2019: unresolved external symbol "int __cdecl something(int)" ([email protected]@[email protected]) referenced in function _main 
1>D:\Projects\New folder\TestUndefinedReference\Debug\TestUndefinedReference.exe : fatal error LNK1120: 1 unresolved externals 

इस कनवर्टर का उपयोग करके

1> D:/Git/eV+/program/taskqueue.c(94,1) error LNK2019: unresolved external symbol `thisRandomFunction' 

बी यह दृश्य स्टूडियो लिंकर त्रुटि दुभाषिया की नकल करने के लिए पर्याप्त नहीं है। लिंकर त्रुटि देखने के लिए न्यूनतम आवश्यकताएं क्या हैं? क्या कोई समाधान है जो सीधे पाठ को पार्स किए बिना काम कर सकता है?

+0

सभी सब में कमी है कोड परियोजना के लिए अपने लिंक को पढ़ने के बाद एक अच्छा सवाल है (कृपया बहाना मेरे पूर्व quirks)। अपने प्रश्न के संक्षिप्त जवाब प्राप्त करने के लिए, आपको इसे और अधिक प्रमुख बनाना चाहिए, संक्षेप में समझाएं। मेरे पास एक नहीं है, क्षमा करें। –

+0

क्या आपने '/' से '\' तक स्लैश रूपांतरण जोड़ने का प्रयास किया था? $ str = ~ s/\ // \\ /; –

+0

@JimBlack हाँ, हम "\" को परिवर्तित करते हैं। प्रश्न –

उत्तर

1
the documentation के अनुसार

...

उत्पादन का स्वरूप होना चाहिए:

+०१२३५१६४१०६१
{filename (line# [, column#]) | toolname} : 
[any text] {error | warning} code####: localizable string 

कहाँ:

  • {एक | बी} या तो एक या बी का विकल्प है।
  • [सीसीसी] एक वैकल्पिक स्ट्रिंग या पैरामीटर है।

उदाहरण के लिए:

C:\sourcefile.cpp(134) : error C2143: syntax error : missing ';' before '}' 
LINK : fatal error LNK1104: cannot open file 'somelib.lib' 


आपका नमूना विफल रहता है, क्योंकि यह एक आवश्यक बृहदान्त्र

D:/Git/eV+/program/taskqueue.c(94,1) error LNK2019: unresolved external symbol `thisRandomFunction' 
            ^
+0

धन्यवाद, जब मैं पर्ल स्क्रिप्ट का निर्माण कर रहा था, तो मुझे यह दस्तावेज नहीं मिला। इसने स्क्रिप्ट के साथ कई समस्याओं को उजागर किया है। –

0

तो ऐसा लगता है इस लाइन को जोड़ने यह करने के लिए पर्याप्त है:

taskqueue.obj : error LNK2019: unresolved external symbol "thisRandomFunction" referenced in function TaskQueueAdd 

जहां तक ​​मैं बता सकता हूँ त्रुटि निम्न कुंजी के माध्यम से पता लगाया जाएगा:

[*].obj : error LNK2019: unresolved external symbol "[*]" referenced in function [*] 

कहाँ [*] कुछ भी या कुछ भी नहीं हो सकता है (इसे वास्तविक कार्य भी करने की आवश्यकता नहीं है)।

तो निम्न स्क्रिप्ट यह पार्स करने के लिए पर्याप्त है:

my $previousUsedInFunction = ""; 

sub parseLinkerError 
{ 
    my $str = $_[0]; 
    my $find = "undefined reference to"; 

    #check that our string contains the undefined reference to substring. 
    if (index($str, $find) != -1) { 

     #Use regular expressions to get the important filename. 
     my $filename = ""; 
     if ($str =~ /\\([a-zA-Z0-9_.]*)\(/) { 
      $filename = $1; 
      #replace whatever filename we find with the .obj equivelent. 
      $filename =~ s/\.cpp$/\.obj/g; 
      $filename =~ s/\.h$/\.obj/g; 
      $filename =~ s/\.c$/\.obj/g; 
     } 

     #Use regular expressions to find the function name. 
     my $function = ""; 
     if ($str =~ /\`([a-zA-Z0-9_.()]*)\'/) { 
      $function = $1; 
     } 

     #create the final string similar to what visual studio expects. 
     my $finalStr = " " . $filename . ' : error LNK2019: unresolved external symbol "' . $function . '" referenced in function ' . $previousUsedInFunction . "\n"; 

     return $finalStr; 

    } 
    return $str; 
} 

कहाँ स्ट्रिंग $previousUsedInFunction अगर बयान (यदि हम समारोह संदर्भ में एक था पता लगाने के लिए) के बाद का उपयोग कर मुख्य पार्स पाश में उत्पन्न होता है:

elsif (/\.o\): In function \`([a-zA-Z0-9_.():]*)\'/) { 
    print ("$_"); 
    $previousUsedInFunction = $1;  
} 
संबंधित मुद्दे