2012-06-20 11 views
23

jestem przenoszenie aplikacji z Solaris do Linuksacrt1.o: In function `_start ': - niezdefiniowana odniesienia do` main' w Linuksie

Pliki obiektów, które są związane nie mają main() zdefiniowane. Ale kompilacja i łączenie odbywa się poprawnie w Solarisie i generowany jest plik wykonywalny. W Linuksie otrzymuję ten błąd

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 

Moim problemem jest to, że nie może zawierać nowy .c/.o pliki od czasu jego ogromnej aplikacji i działa już od lat. Jak mogę pozbyć się tego błędu?

extractes kodowe makefile:

RPCAPPN = api 
LINK = cc 

    $(RPCAPPN)_server: $(RPCAPIOBJ) 
      $(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB) 
+0

Czy możesz opublikować plik makefile i/lub rzeczywiste polecenia kompilacji? –

+0

Tak ... Dodałem kilka linii z pliku Makefile. – Blackforest

+0

Proste: albo przestajesz dzwonić do głównego, albo definiujĘ ... c główny (^) Dlaczego to działał na solaris? Czy ma specjalne flagi linkerów (link do obiektu współużytkowanego?) – wildplasser

Odpowiedz

23

spróbuj dodać -nostartfiles do opcji linkera, czyli

$(LINK) -nostartfiles -g ... 

Z gcc documentation:

-nostartfiles 
    Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. 

Powoduje crt1.o nie być powiązane (zwykle jest domyślnie połączone) - zwykle używane tylko wtedy, gdy wprowadzasz swój własny kod _start.

+3

w zależności od problemu, to nie jest tak naprawdę rozwiązanie - miałem podobny problem, gdy próbowałem zrobić test doładowania i dodanie tej flagi sprawiło, że wszystko pogorszyło się – serup

13

-shared opcja Link musi dołączyć, gdy spełnione tak

+2

To faktycznie pomogło mi zainstalować pakiet R, który poprzednio nie powiódł się z powyższym błędem. – Thomas

+0

Uzgodnione; to również pomogło mi rozwiązać problem ze skompilowaniem zewnętrznych funkcji dla sqlite. – gregory

1

miałem podobny wynik, gdy próbuje zbudować nowy projekt testowy z podbicia, a okazało się, że brakowało mi jedno oświadczenie:

#define BOOST_TEST_MODULE <yourtestName> 
0

Dla mnie ten błąd pojawia się, gdy używane są surowe znaki UTF-8 w ciągu literowym. ARM7HL, Sailfish OS, GNU C++.