【问题标题】:Compile an iOS Objective-C command line app through gcc on mac在 mac 上通过 gcc 编译一个 iOS Objective-C 命令行应用程序
【发布时间】:2011-11-20 08:32:42
【问题描述】:

这是一个非常简单的 Objective-C 控制台应用程序:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    NSLog(@"Hello world!");

    [pool drain];

    return 0;
}

我在我的 Mac 上使用 gcc main.m -o main -ObjC -framework Foundation -framework CoreLocation 编译它。

我的 Mac 上也安装了 iOS SDK。如何修改此命令以在我的计算机上编译相同的代码,以便在(越狱的)iOS 设备上使用?

然后我可以通过 ssh 传输可执行文件并使用ldid 对其进行签名。

【问题讨论】:

    标签: ios gcc jailbreak


    【解决方案1】:

    对于简单的情况,这可能就足够了:

    gcc -o output -Wall -std=c99 source.m -framework Foundation -lobjc 
    

    更新:

    此命令不适用于 iOS 命令行应用程序 - 必须正确设置拱门。目前我手头没有 iOS 开发环境;可能 -march 标志会有所帮助。

    查看接受的答案。

    【讨论】:

    • 您也可以将gcc 替换为clang 而无需在此处更改任何其他内容。
    • @keith:是的,这可能是未来的正确答案。 Apple 可能会在某个时候停止发布 gcc 包装器。
    • 拱门不需要设置吗?
    • 如果你用 gcc 在越狱的 iDevice 上编译,这个命令会起作用,对吧?
    • @caffinatedmonkey 因为arch通常设置为主机系统,它应该在设备上没有任何arch设置的情况下工作,是的。
    【解决方案2】:

    假设你不喜欢陈旧的旧 GCC,故意在我的项目中触发错误,以便进入 Xcode 将显示所用命令行的位置,显示以下编译:

    /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -x 目标-c -arch armv6 -fmessage-length=0 -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -std=gnu99 -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -W括号 -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -DDEBUG=1 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -gdwarf-2 -mthumb "-DIBOutlet=属性((iboutlet))" “-DIBOutletCollection(ClassName)=属性((iboutletcollection(ClassName)))” "-DIBAction=void)属性((ibaction)" -miphoneos-version-min=3.2 -iquote [簿记文件] -I[标题列表] -iquote [更多 headers] -I[一个包含路径] -fpch-preprocess -F[指向目录的指针 对于调试文件] -include [我的前缀头] -c AppDelegate.m -o AppDelegate.o

    如果您拒绝使用 Xcode,那么我想您至少可以减少有关 Interface Builder 插座的内容。在我的项目中,为 armv6 而不是 v7 构建可能是一个错误。

    然后,链接:

    /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -L[适当的东西] -F[适当的东西] -filelist [a .LinkFileList] -dead_strip -miphoneos-version-min=3.2 -framework SystemConfiguration -framework UIKit -framework Foundation -framework CoreGraphics -o [适当的]

    .LinkedFileList 文件似乎只是一个目标文件列表,每行一个。 Xcode 已将每个路径的完整路径放在那里,尽管我猜相对路径是可以接受的。

    我很欣赏这不是一个完整的答案,但希望它有所帮助?

    【讨论】:

      【解决方案3】:

      要在你的 Mac 上编译 iOS 代码,你需要使用交叉编译器,即在 Intel 平台上运行并能够生成 ARM 二进制代码的编译器。

      Xcode 确实提供了这样一个交叉编译器。它位于(假设您使用的是从 App Store 分发的 Xcode 4.3)

      /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
      

      对于一个简单的“hello world”类型的程序,我正在编译使用

      alias c="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2"
      c -o hello hello.c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/
      

      【讨论】:

        【解决方案4】:

        为什么不使用xcodebuild 而不是直接调用gcc?

        【讨论】:

        • xcodebuild 不是仅用于编译 Xcode 项目吗?我想知道如何避免使用 Xcode。
        • 哦。当然。那么也许你可以这样做:创建一个 iOS Xcode 项目,然后从命令行调用xcodebuild...并观察他在命令行中执行的对 gcc 的调用。然后你应该能够看到它使用了什么命令行参数...... Nad 应该能够使用gcc 自己使用它而不使用xcodebuild
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 2021-03-01
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多