Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Visual C++] kompilacja w trybie release

pomozcie19 10 Gru 2009 15:08 4272 5
  • #1 10 Gru 2009 15:08
    pomozcie19
    Poziom 13  

    Jak dokonam kompilacji w trybie release z domyślnymi parametrami Microsofta Visuala C++ to niestety program działa inaczej niż wersja z trybu debug. Inaczej tzn. daje w pewnych apektach inne wyniki. Ten sam przykład a inne wyniki obliczeń wychodzą. Jaja jakieś.:) No to sobie pomyślałem, że może kod jest jakoś tak optymalizowany w wersji release, że coś knoci obliczenia no i zacząłem zmieniać parametry wersji Release i ustaliłem wszystkie takie same właściwości trybu Release jak Debug i program działa, ale tylko na moim komputerze. Jak przeniosę na inny to pojawia się komunikat po uruchomieniu "Nie można uruchomić aplikacji, ponieważ jej konfiguracja równoczesna jest niewłaściwa". Więc 2 pytania:
    1. Co zrobić by móc uruchomić program na innym komputerze?
    2. Program nieprawidłowo działający z domyślnymi parametrami trybu Release działa na innych komputerach, tylko że no nieprawidłowo wykonuje obliczenia, w związku z czym co może być tego przyczyną? Czy może mieć na to wpływ to że jest około 2 tys. warningów??? (warningi jak wiadomo przechodzą kompilacje).

    0 5
  • #2 10 Gru 2009 15:23
    MiL999
    Poziom 26  

    Jest taka możliwość że nie inicjujesz zmiennych wartościami. Możesz deklarować np. zmienną int, nie nadać jej wartości i od razu coś do niej dodawać. Podejrzewam że kompilacja Release i Debug różni się w tym aspekcie i wartość początkowa zmiennej jest różna. Sam miałem taką sytuację i podejrzewam że to może być jedna z przyczyn.

    0
  • #3 10 Gru 2009 15:26
    kotlar
    Poziom 13  

    Zgadzam się z przedmówcą.
    Też miałem takie przypadki.
    Usuń warningi i wszystko powinno być ok.

    0
  • #4 12 Gru 2009 12:18
    pomozcie19
    Poziom 13  

    Czyli podsumowując, aby wszystko było ok w trybie release to muszę zamienić każdą z deklaracji np.
    int x;
    na int x=0;
    ???
    kotlar pod twierdzeniem usuń warningi nie masz na myśli chyba, aby poprawić tak kod, by podczas kompilacji nie było warningów, bo ich mam z 2 tys. to z pół roku bym usuwał:)

    0
  • #5 12 Gru 2009 13:19
    x3r
    Poziom 17  

    Oczywiście, że usuwać warningi. Prawdopodobnie te warningi wskazują dlaczego kod działa inaczej w wersji release a inaczej w debug. Jak upodobnisz opcje kompilacji w release do debugowych to dostaniesz nic innego jak poprostu build debugowy.

    Podsumowując, na sam początek proponuje pozbyć się warningów i dalej pisać tak aby nowe nie powstawały. Co do "nie można uruchomić aplikacji..." to prawdopodobnie potrzebujesz na drugim kompie Visual C++ Redistributable. Nawiasem mówiąc kiedy uda Ci się skompilować kod do prawdziwej wersji release (a nie ze zmienionymi przez Ciebie opcjami kompilacji) to na innym kompie prawdopodobnie nie będzie już wymagany redistributable package.

    pozdrawiam

    0
  • #6 15 Gru 2009 22:17
    pomozcie19
    Poziom 13  

    Udało się zrobić, że aplikacja w trybie debug jest przenośna i działa na drugim kompie. W tym celu ustawiłem w trybie debug we właściwościach Incremental Linking na NO. Następnie nie dawałem żadnych optymalizacji. No i pokopiowałem z katalogu Visuala biblioteki z katalogu Debug_NonRedist do folderu gdzie jest .exe aplikacji i działa.:) Pytanie kiedy nie będzie działać?, bo musiałem przejrzeć tony stron w necie by dokopać się do tego patentu, więc stąd wniosek, że pewnie to nie jest dobre rozwiązanie, skoro brak ogólnie dostępnych informacji na ten temat.

    Warningów jest z 2 tys. tzn. jest ich tyle, ale tylko z 6,7 rodzajów. Oto one:
    1.) warning C4244: '=' : conversion from 'LRESULT' to 'UINT', possible loss of data
    (zamiast LRESULT i UINT są różne formaty np. 'size_t' to 'unsigned int' itd.)
    2.) warning C4996: 'itoa' was declared deprecated
    (zamiast itoa często pojawia się fopen, fprintf, sprintf, strcpy i różne inne)
    3.) warning C4101: 'znak' : unreferenced local variable
    4.) signed/unsigned mismatch
    (to odnosi się do linjek typu for(int d=0;d<z;d++) gdzie d jest typu int a 'z' typu unsigned int)
    5.) Do linijki w pliku header.h: extern struct struktura{int pole1; string bufor}; wyskakuje warning
    warning C4091: 'extern ' : ignored on left of 'struktura' when no variable is declared
    6.)
    Do linijki buff[0]=223; gdzie buff jest tablicą 4 char (deklarowaną tak char buff[4]) wyskakuje ostrzeżenie:
    warning C4309: '=' : truncation of constant value

    Ad. 1.)
    Ten błąd wynika z tego, że raczej w programie rzadko stosowałem operacje rzutowania. To czy opłaca się zastosować w kodzie rzutowanie?
    Ad. 2.)
    Błędy tego typu wynikają, że stosowałem dużo razy funckję itoa, sprintf itd. To co nie można tego stosować?
    Ad 3.)
    Czy dla wszystkich zmiennych deklarowanych trzeba zastosować przypisanie w momencie deklaracji czy można pozostawić tak?
    Ad 4.)
    W moim kodzie nigdy żadna liczba nie osiągnie nawet miliarda więc beznaczenia prawda?:)
    Ad 5.)
    Jak zlikwidować ten warning? Bo usunąłem całkiem to się pojawiły errory, więc linijka musi tam być.
    Ad 6.)
    Nie pamiętam o co chodzi. Chyba pod liczbą 223 mieści sie jakiś potrzebny mi znak w kodzie ASCII. Operację rzutowania tu zastosować??? Jeśli tak to na co?

    A więc wszystkie zmienne poza char znak, buff[32], buff[4] są inicjowane. Te 3 co nie są mam 100% pewności, że nie są używane bez wcześniejszego przypisania, stąd pytanie takie z ciekawości JAK znaleźć różnicę między wynikiem z programu release a debug??? Zaznaczam, że rożnica występuje przy wywaleniu z trybu release wszelkich optymalizacji, więc to odpada.

    1