2010-08-01 1 views
0

Я пытаюсь использовать функции gcc-инструмента с g ++-компилятором MinGW, но у i всегда возникали проблемы с компоновщиками. Можно ли использовать функции прибора с помощью MinGW/MSYS?Использование функций gcc/g ++ с функцией MinGW?

Выходной отказ линкер:

$ g++ instrumentFunctions.cpp -o iftest -finstrument-functions >> iflog.txt 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x4e): undefined reference to `__cyg_prof 
ile_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x158): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x179): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x18c): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1a7): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1bf): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1db): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1f3): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x22f): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x27a): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x29b): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x2e4): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x2ff): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x326): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x341): undefined reference to `__cyg_pro 
file_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x368): undefined reference to `__cyg_pro 
file_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$printf[_printf]+0x16): undefined referenc 
e to `__cyg_profile_func_enter' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$printf[_printf]+0x43): undefined referenc 
e to `__cyg_profile_func_exit' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$_ZSt3minIjERKT_S2_S2_[unsigned int const& 
std::min<unsigned int>(unsigned int const&, unsigned int const&)]+0x15): undefined reference to `__cyg_profile_func_ent 
er' 
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$_ZSt3minIjERKT_S2_S2_[unsigned int const& 
std::min<unsigned int>(unsigned int const&, unsigned int const&)]+0x42): undefined reference to `__cyg_profile_func_exi 
t' 
collect2: ld returned 1 exit status 

г ++ команды я использую:

g++ iftest.cpp -o iftest -finstruction-functions 

Листинг моего testsource:

#include <stdio.h> 

    void __cyg_profile_func_enter(void *, void *) __attribute__ ((no_instrument_function)); 

    void __cyg_profile_func_enter(void *func, void *callsite) 
    { 
    printf("%p\n", (int)func); 
    } 


    void func_c(void) 
    { 
    return; 
    } 

    void func_b(void) 
    { 
    func_c(); 

    return; 
    } 

    void func_a(void) 
    { 
    func_b(); 
    return; 
    } 


    int main() 
    { 
    func_a(); 
    func_c(); 
    } 

ответ

5

Вы должны дать __cyg * функции «C "связь. Функция, определенная в C++, обычно получает искаженное имя, которое нельзя использовать из библиотек, не написанных на C++. Вы можете попросить компилятор дать функцию, которую дал бы имя C, используя блок «extern» C »{}. Следующее должно составить штраф.

#include <stdio.h> 

extern "C" { 
    void __cyg_profile_func_enter(void *, void *) __attribute__ ((no_instrument_function)); 

    void __cyg_profile_func_enter(void *func, void *callsite) 
    { 
    printf("enter %p\n", func); 
    } 
    void __cyg_profile_func_exit(void *, void *) __attribute__ ((no_instrument_function)); 

    void __cyg_profile_func_exit(void *func, void *callsite) 
    { 
    printf("exit %p\n", func); 
    } 

} 
    void func_c(void) 
    { 
    return; 
    } 

    void func_b(void) 
    { 
    func_c(); 

    return; 
    } 

    void func_a(void) 
    { 
    func_b(); 
    return; 
    } 


    int main() 
    { 
    func_a(); 
    func_c(); 
    }