cmake MacOS.app无法通过双击打开文件

cuxqih21  于 2022-11-11  发布在  Mac
关注(0)|答案(1)|浏览(277)

我有一个c++程序,它应该从argv获取文件名,打开这个文件,并使用它。
程序运行得非常好,因为:当我从终端调用二进制(Unix Executable)时,程序从argv获取名称并使用它,但当我从这个二进制MacOs程序.app中创建程序时,然后双击文件,打开该程序,程序抛出此错误:

同样,如果我启动二进制文件(已经在.app目录中),一切正常,但如果我从终端运行程序.app,程序将再次抛出此错误
我测试的终端命令列表:
open -a /Applications/Sengine.app obj/rogers.mdl-不起作用
/Applications/Sengine.app/Contents/MacOS/SENGINE obj/rogers.mdl-确实有效
cmake-build-debug/SENGINE obj/rogers.mdl-确实有效
我正在用cmake编译程序:
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build cmake-build-debug --target SENGINE -- -j 3
.app程序中的文件info.plist,以防万一:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5. <key>CFBundleDisplayName</key>
  6. <string>Sengine</string>
  7. <key>CFBundleExecutable</key>
  8. <string>Sengine</string>
  9. <key>CFBundleIconFile</key>
  10. <string>icon.icns</string>
  11. <key>CFBundleIdentifier</key>
  12. <string>com.zolars.sengine-department.SENGINE</string>
  13. <key>CFBundleInfoDictionaryVersion</key>
  14. <string>6.0</string>
  15. <key>CFBundleName</key>
  16. <string>Sengine</string>
  17. <key>CFBundlePackageType</key>
  18. <string>APPL</string>
  19. <key>CFBundleShortVersionString</key>
  20. <string>3.0.0</string>
  21. <key>NSHighResolutionCapable</key>
  22. <true/>
  23. <key>CFBundleDocumentTypes</key>
  24. <array>
  25. <dict>
  26. <key>CFBundleTypeIconFiles</key>
  27. <string>mdl.icns</string>
  28. <key>LSItemContentTypes</key>
  29. <array>
  30. <string>mdl</string>
  31. </array>
  32. <key>LSHandlerRank</key>
  33. <string>Owner</string>
  34. </dict>
  35. </array>
  36. </dict>
  37. </plist>

如果我理解正确的话,由于某种原因,双击后,文件名不能到达源二进制文件。我不知道为什么,以及如何修复它。
请帮我拿这个。

irlmq6kh

irlmq6kh1#

当您运行命令行程序时,它的工作方式与所有命令行程序一样,即阅读argv/argc。但是,当您将它与PLIST捆绑到.app目录中时,您是在指示它使用Launch Services和Info.plist文件。
通过这样做,您可以更改它打开文件的方式。使用Launch Services,您可以让应用程序保持运行,并在不重新启动的情况下继续传递新文件。在您的问题中,您有一个如何完成此操作的示例:

  1. open -a /Applications/Sengine.app obj/rogers.mdl

要实现这一点,应用程序需要处理application(_:openFiles:)方法。如果不将此功能添加到您的应用程序中,您将需要一些提供openFiles并通过system()或类似方法执行您的应用程序的中间启动器。

相关问题