在Mac OS X应用程序包中打包C二进制文件



我想把我的二进制包在一个极简的应用程序包。但我看到一些奇怪的行为与结果。

我的bundle有这样的最小结构:

$ ls -R HelloWorld.app
Contents
HelloWorld.app/Contents:
Info.plist MacOS      PkgInfo
HelloWorld.app/Contents/MacOS:
helloworld

helloworld是一个C二进制编译自:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
    while (1) {
        printf("Hello world!n");
        sleep(2);
    }
    return 0;
}

信息。plist包含:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>helloworld</string>
    <key>CFBundleIdentifier</key>
    <string>com.litl.helloworld</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>HelloWorld</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0.0</string>
    <key>CFBundleVersion</key>
    <string>20</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.6</string>
    <key>LSUIElement</key>
    <true/>
    <key>LSBackgroundOnly</key>
    <true/>
</dict>
</plist>

现在是奇怪的行为。当我运行

open ./HelloWorld.app

命令挂起约30s。之后,我可以确认helloworld二进制文件正在运行。然而,它的标准输出并没有显示在Console.app中。如果我以编程方式启动这个bundle (NSWorkspace sharedWorkspace] launchApplicationAtURL…),调用成功,但二进制文件立即退出(我可以在控制台中看到它退出错误代码2)。

这是在OS X 10.9.2。

我做错了什么?

你需要注册Cocoa来标记你的应用程序为响应和'就绪'。如果你启用dock图标,这意味着它会停止反弹。在您的例子中,如果您从dock中隐藏图标,您仍然需要注册Cocoa。

您可以这样做,例如通过创建NSApplication类。

相关内容

  • 没有找到相关文章

最新更新