Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set up CMake to build an app for the iPhone

Tags:

This is closely related to my previous question, which was about using CMake to build a static library on the iPhone. I got that to work setting the CMAKE_OSX_SYSROOT.

However, this doesn't work to build an app. My CMakeLists.txt looks like:

project(TEST)  set(CMAKE_OSX_SYSROOT iphoneos2.2.1) set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_BIT)") set(CMAKE_EXE_LINKER_FLAGS "-framework Foundation -framework OpenGLES -framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit -framework OpenAL" )  set(SRC --my files--)  add_executable(iphone-test MACOSX_BUNDLE ${SRC}) 

A few notes:

  • I'm explicitly giving the -framework linking option because find_library didn't work for all of the frameworks (it found most of them, but not OpenGLES). I don't understand why, since they're all in the same folder ${SDK}/System/Library/Frameworks. This leads me to believe that I was doing something wrong, but I don't know what.
  • I added MACOSX_BUNDLE to the add_executable command so that the product type generated would be com.apple.product-type.application instead of com.apple.product-type.tool, which apparently doesn't exist on the iPhone.

In any case, the app compiles and links correctly, but when I run it in the simulator, I get the dreaded

Failed to launch simulated application: Unknown error. 

There are lots of reported instances of this problem on google and stackoverflow, but all of the solutions involve cleaning up or creating a new project and moving files; but I'm compiling a fresh copy after CMake does its work, so none of that applies.

I found this thread on the CMake mailing list, but it only reports a success in building a library, and then peters out.

like image 813
Jesse Beder Avatar asked May 04 '09 22:05

Jesse Beder


People also ask

How do I set up a build on CMake?

Run the cmake executable or the cmake-gui to configure the project and then build it with your chosen build tool. Run the install step by using the install option of the cmake command (introduced in 3.15, older versions of CMake must use make install ) from the command line, or build the INSTALL target from an IDE.

How do I make an Iphone app using Xcode?

Launch Xcode, then click “Create a new Xcode project” in the Welcome to Xcode window or choose File > New > Project. In the sheet that appears, select the target operating system or platform and a template under Application. In the following sheets, fill out the forms and choose options to configure your project.

What is CMake app?

CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice.


1 Answers

I finally figured out how to do this. Here's what my CMakeLists.txt file looks like:

project(test) set(NAME test)  file(GLOB headers *.h) file(GLOB sources *.cpp)  set(CMAKE_OSX_SYSROOT iphoneos2.2.1) set(CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_BIT)) set(CMAKE_CXX_FLAGS "-x objective-c++") set(CMAKE_EXE_LINKER_FLAGS     "-framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit" ) link_directories(\${HOME}/\${SDKROOT}/lib)  set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.mycompany.\${PRODUCT_NAME:identifier}") set(APP_TYPE MACOSX_BUNDLE)  add_executable(${NAME}     ${APP_TYPE}     ${headers}     ${sources} )  target_link_libraries(${NAME}     # other libraries to link )  # code signing set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") 

Obviously, change mycompany to your company name, and change My Name to your name. I found it's very useful to add the link directory \${HOME}/\${SDKROOT}/lib as above, so that if your app links to a static library (especially a generic (non-iPhone) library), you can build separate iPhoneOS and iPhoneSimulator libraries and easily link to the right one, instead of worrying about a universal binary.

Also, Xcode doesn't seem to properly add resources when you build the project using CMake, so I added this piece to the CMakeLists.txt file. It copies the entire folder /data into my resources folder (as if I had added a "blue" folder link in Xcode).

# copy resource phase  set(APP_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}) set(RES_DIR ${test_SOURCE_DIR}/data) add_custom_command(     TARGET ${NAME}     POST_BUILD     COMMAND /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp -exclude .DS_Store -exclude CVS -exclude .svn -resolve-src-symlinks ${RES_DIR} ${APP_NAME} ) 
like image 196
Jesse Beder Avatar answered Sep 29 '22 04:09

Jesse Beder