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

7

我希望在一个最小化的应用程序包中打包我的二进制文件。但是我发现结果有一些奇怪的行为。

我的应用程序包采用这种最小化结构:

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

Info.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

该命令挂起约30秒时间。之后,我可以确认 helloworld 二进制文件正在运行。但它的标准输出没有显示在 Console.app 中。如果我以编程方式启动此捆绑包(NSWorkspace sharedWorkspace] launchApplicationAtURL...),调用将成功,但二进制文件会立即退出(我可以在控制台中看到它以错误代码 2 退出)。
这是在 OS X 10.9.2 上的情况。
我做错了什么?
1个回答

3

您需要在Cocoa中注册您的应用程序,以将其标记为响应式和“准备就绪”。如果您启用了Dock图标,则表示它停止跳动。在您的情况下,如果您从Dock中隐藏图标,则仍然需要在Cocoa中注册。

您可以通过创建NSApplication类来实现这一点。有关一些低级别详细信息,请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接