objective c - Compilando el proyecto Objective-C en Linux(Ubuntu)




compilation (4)

¿Cómo hacer que un proyecto Objective-C funcione en Ubuntu?

Mis archivos son:

Fracción.h

    #import <Foundation/NSObject.h>

    @interface Fraction: NSObject {
        int numerator;
        int denominator;
    }

    -(void) print;
    -(void) setNumerator: (int) n;
    -(void) setDenominator: (int) d;
    -(int) numerator;
    -(int) denominator;
    @end

Fracción.m

    #import "Fraction.h"
    #import <stdio.h>

    @implementation Fraction
    -(void) print {
        printf( "%i/%i", numerator, denominator );
    }

    -(void) setNumerator: (int) n {
        numerator = n;
    }

    -(void) setDenominator: (int) d {
        denominator = d;
    }

    -(int) denominator {
        return denominator;
    }

    -(int) numerator {
        return numerator;
    }
    @end

main.m

    #import <stdio.h>
    #import "Fraction.h"

    int main( int argc, const char *argv[] ) {
        // create a new instance
        Fraction *frac = [[Fraction alloc] init];

        // set the values
        [frac setNumerator: 1];
        [frac setDenominator: 3];

        // print it
        printf( "The fraction is: " );
        [frac print];
        printf( "\n" );

        // free memory
        [frac release];

        return 0;
    }

He intentado dos enfoques para compilarlo:

  1. Pure gcc:

    $ sudo apt-get install gobjc gnustep gnustep-devel
    $ gcc `gnustep-config --objc-flags` -o main main.m -lobjc -lgnustep-base
    /tmp/ccIQKhfH.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction'
  2. He creado un Makefile GNUmakefile:

    include ${GNUSTEP_MAKEFILES}/common.make
    
    TOOL_NAME = main
    main_OBJC_FILES = main.m
    
    include ${GNUSTEP_MAKEFILES}/tool.make

    ... y corrió:

    $ source /usr/share/GNUstep/Makefiles/GNUstep.sh
    $ make
    Making all for tool main...
     Linking tool main ...
    ./obj/main.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction'

Así que en ambos casos el compilador se atasca en

    undefined reference to `__objc_class_name_Fraction'

¿Tienes una idea de cómo resolver este problema?


Añadir Fraction.m en el archivo make,

incluye $ {GNUSTEP_MAKEFILES} /common.make

TOOL_NAME = main

main_OBJC_FILES = main.m Fraction.m

incluye $ {GNUSTEP_MAKEFILES} /tool.make

y luego hacer ^^


El enfoque que acabo de trabajar fue (en Ubuntu, que está estrechamente relacionado con Debian):

  • Use Synaptic para instalar todos los paquetes GnuStep de apariencia probable;
  • Fuente ( . ) El script de inicio de GnuStep, /usr/share/GNUstep/Makefiles/GNUstep.sh (esto puede ir a .profile o .bashrc o algo así para que no tenga que hacerlo manualmente cada vez)
  • Cree un GNUmakefile acuerdo con las instrucciones en Una primera herramienta

Esto me permitió construir exitosamente programas de línea de comandos.


No soy un experto en escribir los archivos make así, encuentro que simplemente escribo bastante bien los siguientes trabajos en ubuntu:

gcc -I /usr/include/GNUstep/ -I /usr/include/mysql -L /usr/lib/GNUstep/\
    -lgnustep-base -lmysqlclient\
    -g -ggdb\
    -fconstant-string-class=NSConstantString -o test *.m

Lo estoy usando en este proyecto:

http://github.com/uptecs/SmsgateDelivery/

Si el comando GCC anterior no funciona, no ha instalado suficientes paquetes, use apt-cache para buscar más paquetes de gcc y objecto c para instalar (acabo de instalar más paquetes que parecían relevantes al azar hasta que funcionó)


Simplemente agregue Fraction.m en main.m en lugar de agregar Fraction.h en main.m. Y esto funcionará. El siguiente es el archivo main.m que usé:

#import <stdio.h>  
#import "Fraction.m"

int main( int argc, const char *argv[] ) {  
    //create a new instance  
    Fraction *frac = [[Fraction alloc] init];

    //set the values 
    [frac setNumerator: 1];
    [frac setDenominator: 3];

    //print it
    printf("The fraction is : ");
    [frac print];
    printf("\n");

    //free memory
    [frac release];

    return 0;
}






compilation