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

标签 macos bundle launchd app-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;
}

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 上。

我究竟做错了什么?

最佳答案

您需要向 Cocoa 注册以将您的应用程序标记为响应式和“就绪”。如果您启用停靠栏图标,则意味着它停止弹跳。在您的情况下,如果您从 Dock 中隐藏图标,您仍然需要向 Cocoa 注册。

你可以这样做,例如通过创建 NSApplication类(class)。见 here对于一些低级别的交易。

关于macos - 在 Mac OS X 应用程序包中打包 C 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645415/

相关文章:

c++ - Mac 上的问题 : "Can' t find a register in class BREG while reloading asm"

linux - 如何使用命令 "find"在目录中查找包含特定字符串的文件?

android - 在 Bundle 中传递对象 - ClassNotFoundException

ios - 即使更改显示名称,应用程序名称也不会更改。应用程序名称具有 .IPA 扩展名

macos - 创建自动化服务以在当前目录中创建新文档

objective-c - BWToolkit token header ?

ruby-on-rails - 获取有关 Capistrano 任务的更多信息

macos - 守护进程与 cocoa

macos - 当您的代码作为 LaunchDaemon 运行时,如何在不重新启动的情况下首次启动 LaunchAgent?