2012-06-20 5 views
23

estoy portar una aplicación de Solaris a Linuxcrt1.o: En función `_start ': - referencia indefinida a` principal' en Linux

Los archivos de objetos que están vinculados no tienen un main() definido. Pero la compilación y el enlace se realizan correctamente en Solaris y se genera el ejecutable. En Linux consigo este error

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

Mi problema es que no se puede incluir la nueva .c/archivos .o desde su una gran aplicación y ha estado funcionando durante años. ¿Cómo puedo deshacerme de este error?

Extractes Código de makefile:

RPCAPPN = api 
LINK = cc 

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

¿Se puede publicar el makefile y/o los comandos de compilación reales? –

+0

Sí .. He agregado algunas líneas de makefile. – Blackforest

+0

Simple: o deja de llamar a main o define un main (^) ¿Por qué funcionó en Solaris? ¿Tenía indicadores de vinculador especiales (enlace al objeto compartido?) – wildplasser

Respuesta

23

Trate de añadir -nostartfiles a sus opciones de enlazador, es decir

$(LINK) -nostartfiles -g ... 

Desde el 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. 

Esto hace que crt1.o de no estar vinculados (normalmente está vinculado por defecto) - normalmente solo se usa cuando implementa su propio código _start.

+3

dependiendo del problema, entonces esto no es realmente una solución. Tuve un problema similar cuando intenté hacer un proyecto de prueba de refuerzo y agregar esta bandera empeoró las cosas – serup

13

opción de enlace -shared debe anexar al cumplirse un modo

+2

Esto en realidad me ayudó a instalar un paquete R que anteriormente falló con el error anterior. – Thomas

+0

de acuerdo; esto también me ayudó a resolver un problema con la compilación de funciones externas para sqlite. – gregory

1

tuve resultado similar cuando se trata de construir un nuevo proyecto de prueba con el impulso, y resultó que me estaba perdiendo una declaración:

#define BOOST_TEST_MODULE <yourtestName> 
0

Para mí, este error aparece cuando se usan caracteres UTF-8 sin formato en un literal de cadena. ARM7HL, Sailfish OS, GNU C++.

Cuestiones relacionadas