使用CMake编译iOS应用程序

24

我使用CMake作为构建工具编译了一个C++静态库,并希望将它链接到我的iOS应用程序中。
我在Xcode中创建了一个简单的“Empty”应用程序,并将名为libengine.a的库链接到其中。
我尝试编译我的iOS项目,链接器给了我这个警告:

ignoring file /Users/.../build/engine/libengine.a, 
file was built for archive which is not the architecture being linked (i386):
/Users/.../build/engine/libengine.a

我理解需要为ARM处理器编译我的库,但问题是我不知道怎么做。
我认为CMake真的缺乏好的教程。
无论如何,我的CMake脚本如下。

非常感谢任何帮助。
谢谢,Tal。

这是我的主要CMake脚本:

cmake_minimum_required(VERSION 2.8)

project(movie-night)

if (DEFINED PLATFORM)
    include(toolchains/ios.cmake)
endif()

add_definitions(-Wall)

set(DEBUG)

if (DEFINED DEBUG)
    add_definitions(-g)
endif()

if (DEFINED RELEASE)
    add_definitions(-O3)
endif()

add_subdirectory(engine)
add_subdirectory(ui)

add_subdirectory(test)

这是我的toolchains/ios.cmake文件:

set(CMAKE_SYSTEM_NAME Darwin)
set(CMAKE_SYSTEM_PROCESSOR arm)
4个回答

15

只需使用这个工具链文件:http://code.google.com/p/ios-cmake/,并将其用作

cmake -DCMAKE_TOOLCHAIN_FILE=path_to_your_toolchain_file

然后,在CMakeLists.txt文件中:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch armv7")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch armv7")

1
无法在cmake 2.8.11上工作,出现以下错误: CMake错误:找不到cmake模块文件:/Users/leanidchaika/job/lge/build/CMakeFiles/2.8.11.2/CMakeCCompiler.cmake CMake错误:找不到cmake模块文件:/Users/leanidchaika/job/lge/build/CMakeFiles/2.8.11.2/CMakeCXXCompiler.cmake - leanid.chaika
2
这是一个更近期的链接工具链分支:https://github.com/cristeab/ios-cmake我在旧版本中遇到了一些错误,但在这个版本中已经修复了。 - Olli Niskanen
1
在 GitHub 上发现了一个新的分支 ios-cmake,已经获得了 1K+ 的星标! - Top-Master

13

按照 cmake-toolchains 文档的指引,我像下面这样进行了操作:

cmake -G Xcode -B build \
    -DCMAKE_SYSTEM_NAME=iOS \
    -DCMAKE_Swift_COMPILER_FORCED=true \
    -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0

注意: 当开发面向iOS的应用时,赋值 CMAKE_OSX_DEPLOYMENT_TARGET=11.0 并非错误。


我正在使用coturn主服务器作为Turn客户端库。我已经成功生成了cmake构建,但是libturnutils.a文件只适用于Mac OS。我应该做哪些更改才能使其适用于iOS? - Manthan

3

2

有第二个版本的iOS.cmake,位于:

https://ceres-solver.googlesource.com

注意:你可能会发现iOS.cmake的两个版本只会构建项目的x86版本。 CMake现在将CMAKE_OSX_SYSROOT设置为您系统上可用的(最新的)Mac OS X SDK。 您可以通过修改iOS.cmake副本来始终设置CMAKE_OSX_SYSROOT来解决此问题。 您可以通过在iOS.cmake副本中注释掉几行来完成此操作:

# -- Under CMake 3.4.2, CMAKE_OSX_SYSROOT is automatically defined to point to the latest Mac OS X SDK. --
# -- So, the iOS SDK is never found.  Grab the correct CMAKE_OS_SYSROOT and ignore any prior setting.   --

# If user did not specify the SDK root to use, then query xcodebuild for it.
# if (NOT CMAKE_OSX_SYSROOT)
  execute_process(COMMAND xcodebuild -version -sdk ${XCODE_IOS_PLATFORM} Path
    OUTPUT_VARIABLE CMAKE_OSX_SYSROOT
    ERROR_QUIET
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  message (STATUS "Using SDK: ${CMAKE_OSX_SYSROOT} for platform: ${IOS_PLATFORM}")
  message (STATUS "be sure the previous line points to the correct SDK")
# endif ( )

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