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:
-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.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.
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.
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.
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.
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} )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With