在最终编译阶段而不是检测时,如何使Cmake使用特定的编译器和标志?

| 我正在尝试从Mac OS X交叉编译到iOS。使用ѭ0可以很容易地将源交叉编译为iOS目标。我们只需要3个参数即可使其工作。
clang
-arch armv6
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk
-miphoneos-version-min=4.3
但是问题是我必须构建一个与Cmake打包在一起的库(子弹物理学)。据我所知,Cmake还没有iOS支持。 因此,我制作了一个工具链文件。
SET (CMAKE_SYSTEM_NAME      \"Generic\")
SET (CMAKE_SYSTEM_VERSION   \"4.3\")
SET (CMAKE_SYSTEM_PROCESSOR \"arm\")
SET (CMAKE_CROSSCOMPILING   TRUE)

SET (SDKVER \"4.3\")
SET (DEVROOT \"/Developer/Platforms/iPhoneOS.platform/Developer\")
SET (SDKROOT \"/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk\")
SET (CMAKE_OSX_SYSROOT \"${SDKROOT}\")
SET (CMAKE_OSX_ARCHITECTURES \"armv6\" \"armv7\")

SET (CMAKE_C_COMPILER   \"${DEVROOT}/usr/bin/clang\")
SET (CMAKE_CXX_COMPILER \"${DEVROOT}/usr/bin/clang++\")
SET (CMAKE_C_FLAGS      \"-arch armv6 -arch armv7 -isysroot ${SDKROOT} -std=c99 -x objective-c -DNDEBUG=1\")
SET (CMAKE_CXX_FLAGS    \"-arch armv6 -arch armv7 -isysroot ${SDKROOT} -x objective-c++ -DNDEBUG=1\")

SET (CMAKE_EXE_LINKER_FLAGS    \"-miphoneos-version-min=${SDKVER}\")
SET (CMAKE_SHARED_LINKER_FLAGS \"-miphoneos-version-min=${SDKVER}\")
SET (CMAKE_MODULE_LINKER_FLAGS \"-miphoneos-version-min=${SDKVER}\")

SET (CMAKE_FIND_ROOT_PATH              \"${SDKROOT}\" \"${DEVROOT}\")
SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
并执行。
cmake   -DCMAKE_TOOLCHAIN_FILE=../CMAKE_IPHONEOS_TOOLCHAIN.cmake ../bullet-2.78
cmake
表现不错。
make
做得很好。所有构建完成,没有任何错误。但是,构建的二进制文件是“ 6”个非脂肪二进制文件,而不是“ 7”个非脂肪二进制文件。生成的
Makefile
不适用于交叉编译。似乎在构建时未使用编译器和标志(包括
-isysroot
)。如何使用参数?     
已邀请:
        我解决了这个问题,并为iOS建立了Bullet Physics。 解 这是我使用的工具链配置。
INCLUDE(CMakeForceCompiler)

SET (CMAKE_CROSSCOMPILING   TRUE)
SET (CMAKE_SYSTEM_NAME      \"Darwin\")
SET (CMAKE_SYSTEM_PROCESSOR \"arm\")

SET (SDKVER     \"4.3\")
SET (DEVROOT    \"/Developer/Platforms/iPhoneOS.platform/Developer\")
SET (SDKROOT    \"/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDKVER}.sdk\")
SET (CC         \"${DEVROOT}/usr/bin/clang\")
SET (CXX        \"${DEVROOT}/usr/bin/clang++\")

CMAKE_FORCE_C_COMPILER          (${CC} CLang)
CMAKE_FORCE_CXX_COMPILER        (${CXX} CLang)

SET (CMAKE_FIND_ROOT_PATH               \"${SDKROOT}\" \"${DEVROOT}\")
SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM  NEVER)
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY  ONLY)
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE  ONLY)
还有构建脚本。这个很重要!
PKG_NAME=bullet-2.78
BUILD_DIR=build

rm      -rf ${PKG_NAME} ${BUILD_DIR}
tar     -x -f ${PKG_NAME}-r2387.tar

mkdir   build
cd      build

DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
SYSROOT=$DEVROOT/SDKs/iPhoneOS4.3.sdk
CC=$DEVROOT/usr/bin/clang
CXX=$DEVROOT/usr/bin/clang++
CFLAGS=\"-arch armv6 -arch armv7 -isysroot $SYSROOT -miphoneos-version-min=4.0\"
CXXFLAGS=$CFLAGS
LDFLAGS=$CFLAGS

export  CC=$CC
export  CXX=$CXX
export  CFLAGS=$CFLAGS
export  CXXFLAGS=$CXXFLAGS
export  LDFLAGS=$LDFLAGS

cmake   ../$PKG_NAME -DCMAKE_TOOLCHAIN_FILE=../CMAKE_IPHONEOS_TOOLCHAIN.cmake
make
lipo    -info src/LinearMath/libLinearMath.a
这是非常小的配置。但是你明白了。 描述 首先,工具链配置只是确定目标机器上可用功能的一个阶段。但是到iOS的交叉编译需要一些特殊的编译器标志,这是Cmake Wiki中描述的异常情况。 所以我只是强制使用特定的编译器,而Cmake将跳过编译器验证阶段。 其次,通过构建脚本中的shell变量导出提供交叉编译所需的所有编译器标志。这是非常粗糙的选项,但是重要的是我们必须通过shell变量进行传递。不适用于工具链配置。 但是,某种工具链配置会影响生成的
Makefile
。我们必须指定正确的
CMAKE_SYSTEM_NAME
Darwin
)和
CMAKE_SYSTEM_PROCESSOR
arm
)。 更新资料 还有另一个试验。无论如何,这些不再对我有用。 http://code.google.com/p/ios-cmake/ http://www.ltengsoft.com/node/20 还有一个。这看起来很有希望。 http://immersedcode.org/2011/4/25/sdl-on-ios/ 更新2 现在Bullet包含适用于iOS平台的构建脚本。无论如何,这很不方便,因为它不能满足模拟器的特殊需求,我写了另一个构建脚本,该脚本为调试/发布模式提供了远库。 https://github.com/Eonil/Bullet-PhysicsEngine-BuildScript     

要回复问题请先登录注册