【问题标题】:CMake xib to nib compilation for iOS targetCMake xib 到 iOS 目标的 nib 编译
【发布时间】:2011-11-19 16:47:46
【问题描述】:

我的目标是 iOS(设备和模拟器)并设置 CMake 以在包中添加所需的不同资源。 “xib”文件给了我一些问题。如果我不采取进一步措施,iPhone/iPad 模拟器运行将失败并出现以下错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
  reason: 'Could not load NIB in bundle:
   'NSBundle </Users/danieldekkers/Library/Application Support/iPhone Simulator/4.3.2/Applications/1C29638B-7593-4311-8F94-C8051AF90AD7/Discs.app> 
      (loaded)' with name 'MainWindow''

捆绑包中缺少 NIB 文件。 一个示例 (http://www.vtk.org/Wiki/CMake:OSX_InterfaceBuilderFiles) 显示,对于 OSX,您必须将 xib 文件编译为 nib 文件,并将这些文件作为构建后步骤添加到包中。 所以我的猜测是 iOS 也有类似的情况。 但我的问题是,...我在哪里添加编译的 nib 文件?

我现在在 CMakeLists.txt 中执行此操作:

# We need to compile the interface builder *.xib files to *.nib files to add to the bundle
# Make sure we can find the 'ibtool' program. If we can NOT find it we skip generation of this project
FIND_PROGRAM( IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" )
if ( ${IBTOOL} STREQUAL "IBTOOL-NOTFOUND" )
    MESSAGE( SEND_ERROR "ibtool can not be found" )
ENDIF()

# Compile the .xib files using the 'ibtool' program with the destination being the app package
FOREACH( xib ${RSRC_IOS_XIB_FILES} )
    ADD_CUSTOM_COMMAND( TARGET ${RT_APP_NAME} POST_BUILD
    COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text 
        --compile 
        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${RT_APP_NAME}.app/Contents/Resources/${xib}.nib
        ${RT_APP_ROOT}/rsrc/apple/ios/${xib}.xib
        COMMENT "Compiling ${RT_APP_ROOT}/rsrc/apple/ios/${xib}.xib")
ENDFOREACH()

但我并不真正相信编译步骤的“目的地”,尤其是对于模拟器。

有没有人解决这个问题或者看看我做错了什么?

【问题讨论】:

  • 如果有人感兴趣,我正在寻找这个问题的答案。

标签: ios xcode cmake xib nib


【解决方案1】:

它应该与 CMake Xcode 生成器“正常工作”,将 *.xib 文件作为源添加到 add_executable,然后将 RESOURCE 目标属性设置为列表*.xib 文件。

CMake/Tests/iOSNavApp/CMakeLists.txt文件所示。

此技术应适用于 CMake 2.8.5 及更高版本,以及 Xcode 4 及更高版本。

编辑

将链接中的代码复制/粘贴到此处,以防将来链接损坏:

cmake_minimum_required(VERSION 2.8.5)
project(NavApp3)

set(CMAKE_OSX_SYSROOT iphoneos4.3)
set(CMAKE_OSX_ARCHITECTURES "armv6;armv7;i386")
set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos;-iphonesimulator")

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/Classes
  )

add_library(Functions STATIC TotalFunction.c TotalFunction.h)

set(M_SRCS main.m Classes/NavApp3AppDelegate.m Classes/RootViewController.m)
set(HEADERS Classes/NavApp3AppDelegate.h Classes/RootViewController.h)
set(RESOURCES MainWindow.xib RootViewController.xib)

add_executable(NavApp3 MACOSX_BUNDLE ${M_SRCS} ${HEADERS} ${RESOURCES})

target_link_libraries(NavApp3
  Functions
  "-framework CoreGraphics"
  "-framework Foundation"
  "-framework UIKit"
  )

set_target_properties(NavApp3 PROPERTIES
  MACOSX_BUNDLE_GUI_IDENTIFIER "com.yourcompany.NavApp3"
  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
  RESOURCE "${RESOURCES}"
  XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
  XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
  XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER YES
  XCODE_ATTRIBUTE_GCC_PREFIX_HEADER ${CMAKE_CURRENT_LIST_DIR}/NavApp3_Prefix.pch
  XCODE_ATTRIBUTE_INFOPLIST_PREPROCESS YES
  XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 3.0
  )

【讨论】:

  • 非常感谢!关于应该设置为列出 .xib 文件的 RESOURCE 属性的信息对我来说在网上很难找到!而documentation is a bit misleading,你会认为它是框架保留的属性。顺便说一句,属性标识符中有一个小错误(它是单数),但我无法编辑它。
  • 请在答案中添加 cmakelists.txt 示例,此链接迟早会被破坏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2015-08-04
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多