【问题标题】:Compiling Objective-C project on Linux (Ubuntu)在 Linux (Ubuntu) 上编译 Objective-C 项目
【发布时间】:2010-12-06 05:16:04
【问题描述】:

如何让 Objective-C 项目在 Ubuntu 上运行?

我的文件是:

分数.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

分数.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;
    }

我尝试了两种编译方法:

  1. 纯 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. 我创建了一个 GNUmakefile Makefile:

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

    ...然后跑了:

    $ 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'
    

所以在这两种情况下编译器都会卡在

    undefined reference to `__objc_class_name_Fraction'

您是否知道如何解决此问题?

【问题讨论】:

    标签: objective-c linux ubuntu compilation


    【解决方案1】:

    没错。在这两种情况下,您都没有在要编译的文件列表中包含 Fraction.m,因此它找不到类 Fraction 的实现

    从评论来看,这个命令有效

    gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
    

    【讨论】:

    • 实际上是链接器错误。 newacct 是对的。我也不确定 是否包含。我认为这仅在 MacOS 上提供,而不在 GNUStep 中提供。
    【解决方案2】:

    我不是编写这样的 make 文件的专家,我发现只需在 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
    

    我在这个项目中使用它:

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

    如果上面的 GCC 命令不起作用,您还没有安装足够的软件包,请使用 apt-cache 搜索更多要安装的 gcc 和目标 c 软件包(我只是随机安装了更多看起来相关的软件包,直到它起作用)

    【讨论】:

      【解决方案3】:

      我刚刚开始使用的方法是(在与 Debian 密切相关的 Ubuntu 中):

      • 使用 Synaptic 安装所有看起来可能的 GnuStep 包;
      • 来源(.)GnuStep 启动脚本,/usr/share/GNUstep/Makefiles/GNUstep.sh(这可以进入.profile.bashrc 或其他东西,因此您不必每次都手动执行)
      • 根据A First Tool中的说明创建GNUmakefile

      这使我能够成功构建命令行程序。

      【讨论】:

        【解决方案4】:

        在 make 文件中添加 Fraction.m,


        包括 ${GNUSTEP_MAKEFILES}/common.make

        TOOL_NAME = 主要

        main_OBJC_FILES = main.m Fraction.m

        包括 ${GNUSTEP_MAKEFILES}/tool.make


        然后制作^^

        【讨论】:

          【解决方案5】:

          只需在 main.m 中添加 Fraction.m,而不是在 main.m 中添加 Fraction.h。这将起作用。以下是我使用的 main.m 文件:

          #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;
          }
          

          【讨论】:

            【解决方案6】:

            制作文件:

            include ${GNUSTEP_MAKEFILES}/common.make
            
            APP_NAME=Fraction
            Fraction_HEADERS = Fraction.h
            Fraction_OBJC_FILES = main.m Fraction.m
            
            
            include ${GNUSTEP_MAKEFILES}/application.make
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-07-09
              • 1970-01-01
              • 2012-07-10
              • 1970-01-01
              • 2016-06-12
              • 2017-03-12
              • 1970-01-01
              相关资源
              最近更新 更多