web-dev-qa-db-fra.com

crt1.o: Dans la fonction `_start ': - référence non définie à` main' sous Linux

Je porte une application de Solaris vers Linux

Les fichiers objets qui sont liés n'ont pas de main () défini. Mais la compilation et la liaison se font correctement dans Solaris et l'exécutable est généré. Sous Linux, je reçois cette erreur

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

Mon problème est que je ne peux pas inclure de nouveaux fichiers .c/.o car c'est une énorme application et fonctionne depuis des années. Comment puis-je me débarrasser de cette erreur?

Extraits de code de makefile:

RPCAPPN = api
LINK = cc 

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

Essayez d'ajouter -nostartfiles à vos options de l'éditeur de liens, c'est-à-dire.

$(LINK) -nostartfiles -g ...

De la documentation gcc :

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

Ce qui provoque crt1.o ne pas être lié (il est normalement lié par défaut) - normalement utilisé uniquement lorsque vous implémentez votre propre _start code.

33
Paul R

-shared L'option de lien doit être utilisée lorsque vous compilez un .so

22
user2783604

J'ai eu un résultat similaire en essayant de construire un nouveau projet de test avec boost, et il s'est avéré qu'il me manquait une déclaration:

#define BOOST_TEST_MODULE <yourtestName>
2
serup

J'ai eu un résultat similaire lors de la compilation d'un programme Fortran qui avait des composants C++ liés. Dans mon cas, CMake n'a pas détecté que Fortran devrait être utilisé pour la liaison finale. Les messages renvoyés par make se sont ensuite terminés par

[100%] Linking CXX executable myprogram
/lib/../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
make[3]: *** [myprogram] Error 1
make[2]: *** [CMakeFiles/myprogram.dir/all] Error 2
make[1]: *** [CMakeFiles/myprogram.dir/rule] Error 2
make: *** [myprogram] Error 2

La solution consistait à ajouter

set_target_properties(myprogram PROPERTIES LINKER_LANGUAGE Fortran) 

dans CMakeLists.txt, de sorte que make affiche:

[100%] Linking Fortran executable myprogram
[100%] Built target myprogram
0
Bastian