CMake:为 Mac OS X 应用设置图标

11

我想在使用cmake环境安装Mac OS X应用程序时,在安装过程中设置并安装图标。

因此,我尝试设置

set( MACOSX_BUNDLE_ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/myAopImage.icns )
ADD_EXECUTABLE(MYAPP MACOSX_BUNDLE ${MACOSX_BUNDLE_ICON_FILE} ${allSources})
#(I could set it in the source directory to any other path)
然而,这并不起作用,它会将完整路径写入 Info.plist 文件,并不会将任何内容安装到资源目录中(应用程序文件夹中甚至不会创建资源目录)。
无论如何,即使我手动将信息放入 Info.plist 中。
<key>CFBundleIconFile</key>
<string>myAppImage.icns</string>

通过手动创建"Resources"目录,并将icns文件放入其中,即使在应用程序中,图标也会自动显示。

我该如何解决这个问题?也许一开始可以手动完成,但在cmake环境中也可以实现吗?

2个回答

21

将.icns文件从CMake打包成两个部分:添加源文件本身和在.plist中进行配置。如果您想指定.icns文件的路径(例如,因为它位于子目录中),那么这两个属性将稍微不同地引用.icns文件:

# NOTE: Don't include the path in MACOSX_BUNDLE_ICON_FILE -- this is
# the property added to Info.plist
set(MACOSX_BUNDLE_ICON_FILE myAppImage.icns)

# And this part tells CMake where to find and install the file itself
set(myApp_ICON ${CMAKE_CURRENT_SOURCE_DIR}/images/myAppImage.icns)
set_source_files_properties(${myApp_ICON} PROPERTIES
       MACOSX_PACKAGE_LOCATION "Resources")

add_executable(myApp MACOSX_BUNDLE ${myApp_ICON} ${allSources})

1
我认为第二个答案比第一个更好,因为第二个答案涉及到资源的创建。 - Charles Thomas
同意,这应该是被接受的答案。无需手动编辑 plist 文件! - melMass
这会导致构建文件myTestAPp.app的图标设置为该图标吗?还是只有应用程序在任务栏启动时才设置图标?我无法让.app捆绑包具有它作为图标:/ - Dariusz

6

要将icns文件复制到您的资源文件夹中,您需要在该文件上设置一个源属性。

set_source_files_properties(myAppImage.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")

另外,我在某个地方读到了.plist文件中的字符串不需要.icns后缀。
<string>myAppImage</string> 

应该没问题。

再次感谢,我的回答出现在你的回答之前,所以也许你不会看到它......请参见上文。 - user3478292
关于您的回复,您能详细说明图标位置是什么意思吗? - Mark
现在它应该被删除并变成注释了,希望现在一切都好了,我是这个论坛的新手... - user3478292
就本地化而言,我指的是将其放置在源代码上下文中的目录 - 如果我写入类似于set_source_file_properties(${CMAKE_SOURCE_DIR}/icons/myicon.icns....)的内容,则cmake将完整的绝对路径写入plist.info文件中,但是如果我直接将图标放入cmake-source-dir中,并且我只写入set_source_file_properties(myicon.icns....),那么只有这个被写入并且它会被正确安装... 但是这不允许我将图标放在cmake源代码中的额外目录中... - user3478292
你可以从包含cmakelists.txt的目录中指定相对路径。在你的情况下,你可以使用./icons/myicon.icns来包含该文件。另外,如果我的回答解决了你的问题,你可以接受答案将其标记为正确的答案。 - Mark

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