crt1.o: In function `_start': - undefined reference to `main' in Linux

LinuxMainUndefined Reference

Linux Problem Overview


I am porting an application from Solaris to Linux

The object files which are linked do not have a main() defined. But compilation and linking is done properly in Solaris and executable is generated. In Linux I get this error

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

My problem is, I cannot include new .c/.o files since its a huge application and has been running for years. How can I get rid of this error?

Code extractes of makefile:

RPCAPPN = api
LINK = cc 

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

Linux Solutions


Solution 1 - Linux

Try adding -nostartfiles to your linker options, i.e.

$(LINK) -nostartfiles -g ...

From the 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. 

This causes crt1.o not to be linked (it's normally linked by default) - normally only used when you implement your own _start code.

Solution 2 - Linux

-shared link option must be used when you compile a .so

Solution 3 - Linux

The issue for me was, I by mistake put int main() in a namespace. Make sure don't do that otherwise you will get this annoying link error.

Hope this helps anyone :)

Solution 4 - Linux

I had similar result when trying to build a new test project with boost, and it turned out that I was missing one declaration :

#define BOOST_TEST_MODULE <yourtestName>

Solution 5 - Linux

I had a similar result when compiling a Fortran program that had C++ components linked in. In my case, CMake failed to detect that Fortran should be used for the final linking. The messages returned by make then ended with

[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

The solution was to add

set_target_properties(myprogram PROPERTIES LINKER_LANGUAGE Fortran) 

to the CMakeLists.txt, so that make prints out:

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

Solution 6 - Linux

I had this same problem when creating my c project, and I forgot to save my main.c file, so there was no main function.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBlackforestView Question on Stackoverflow
Solution 1 - LinuxPaul RView Answer on Stackoverflow
Solution 2 - Linuxuser2783604View Answer on Stackoverflow
Solution 3 - LinuxMoshe RabaevView Answer on Stackoverflow
Solution 4 - LinuxserupView Answer on Stackoverflow
Solution 5 - LinuxBastianView Answer on Stackoverflow
Solution 6 - LinuxNailuj29View Answer on Stackoverflow