在CMake上交叉编译到OSX时设置SDK

烈火

我正在使用CMake从Linux交叉编译到OSX。为此,我使用了一个工具链文件,因此调用如下所示:

cmake -G 'Unix Makefiles' -DCMAKE_TOOLCHAIN_FILE=./cmake/toolchains/c.apple.universal.cmake .

工具链文件如下所示:

SET(CMAKE_SYSTEM_NAME Darwin)
SET(CMAKE_SYSTEM_PROCESSOR universal)

# set compilers...
INCLUDE("${CMAKE_CURRENT_LIST_DIR}/c.apple.common.cmake")

而另一个:

INCLUDE("${CMAKE_CURRENT_LIST_DIR}/../Modules/CMakeMacroSetCCache.cmake")

# specify the cross compiler
SET_CCACHE(CMAKE_C_COMPILER i686-apple-darwin10-gcc)
SET_CCACHE(CMAKE_CXX_COMPILER i686-apple-darwin10-g++)
SET(CMAKE_RANLIB i686-apple-darwin10-ranlib CACHE STRING "" FORCE)
SET(CMAKE_LIPO i686-apple-darwin10-lipo CACHE STRING "" FORCE)

SET(OSX104_SDK "/usr/lib/apple/SDKs/MacOSX10.4.sdk")
SET(OSX105_SDK "/usr/lib/apple/SDKs/MacOSX10.5.sdk")

# set SDK
SET(CMAKE_OSX_DEPLOYMENT_TARGET )
IF(EXISTS ${OSX104_SDK})
    SET(CMAKE_OSX_SYSROOT ${OSX104_SDK})
ELSEIF(EXISTS ${OSX105_SDK})
    SET(CMAKE_OSX_SYSROOT ${OSX105_SDK})
ELSE()
    MESSAGE(FATAL_ERROR "No OSX SDK found!")
ENDIF()
MESSAGE(STATUS "Using OSX SDK at ${CMAKE_OSX_SYSROOT}")

SET(CMAKE_PREFIX_PATH ${CMAKE_OSX_SYSROOT})
SET(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH})
SET(BOOST_ROOT ${CMAKE_PREFIX_PATH})

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

到目前为止,该方法仍然有效,但是CMake在某种程度上会重置CMAKE_OSX_SYSROOT。我得到的输出是:

-- Set CMAKE_C_COMPILER to /usr/lib/ccache-lipo/i686-apple-darwin10-gcc
-- Set CMAKE_CXX_COMPILER to /usr/lib/ccache-lipo/i686-apple-darwin10-g++
-- Using OSX SDK at /usr/lib/apple/SDKs/MacOSX10.5.sdk
-- Set CMAKE_C_COMPILER to /usr/lib/ccache-lipo/i686-apple-darwin10-gcc
-- Set CMAKE_CXX_COMPILER to /usr/lib/ccache-lipo/i686-apple-darwin10-g++
-- Using OSX SDK at /usr/lib/apple/SDKs/MacOSX10.5.sdk
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Check for working C compiler: /usr/lib/ccache-lipo/i686-apple-darwin10-gcc
-- Check for working C compiler: /usr/lib/ccache-lipo/i686-apple-darwin10-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Checking whether CXX compiler has -isysroot
-- Checking whether CXX compiler has -isysroot - yes
-- Checking whether CXX compiler supports OSX deployment target flag
-- Checking whether CXX compiler supports OSX deployment target flag - yes
-- Check for working CXX compiler: /usr/lib/ccache-lipo/i686-apple-darwin10-g++
-- Check for working CXX compiler: /usr/lib/ccache-lipo/i686-apple-darwin10-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Used Toolchain definition file '/srv/jenkins/.../cmake/toolchains/c.apple.universal.cmake'
-- Configuring for cross-compiling to Darwin on universal
-- Using platform config cmake/darwin.cmake
-- Checking /Developer/SDKs/MacOSX.sdk/usr/lib/libSystem.B.dylib for possible architectures

最后三行来自CMakeList.txt。使用了正确的工具链文件(仅是一​​条消息),正确设置了SYSTEM_NAME和SYSTEM_PROCESSOR,但OSX SDK错误。相应的CMake代码来自一个宏,该宏将设置CMAKE_OSX_ARCHITECTURES(如果之前未设置的话)(在这种情况下)。该行是:

MESSAGE(STATUS "Checking ${CMAKE_OSX_SYSROOT}/usr/lib/libSystem.B.dylib for possible architectures")

我在这里错误地使用CMake吗?CMake为什么要重置OSX_SYSROOT?根据http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_OSX_SYSROOT.html的介绍,它也应该影响FIND *命令,但我需要设置CMAKE_FIND_ROOT_PATH才能正常工作。

奇怪的是,它昨天起作用了。清理整个构建目录(我也肯定也是昨天做过的)并重新运行CMake现在将重置CMAKE_OSX_SYSROOT。

如果这样做有所不同:在宏的包含结束执行之前调用PROJECT,这表明错误的sysroot。

烈火

我发现的解决方案是将变量设置到缓存中。这样,它在CMake处理过程中“生存”:

SET(CMAKE_OSX_SYSROOT ${CMAKE_OSX_SYSROOT} CACHE PATH "..." FORCE)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MAC上交叉编译C时出现libcurl问题

来自分类Dev

在ARM上交叉编译ImageMagick

来自分类Dev

在ubuntu上交叉编译Boost 1.57.0 for arm

来自分类Dev

当副本包含空格时,如何使用bazel在docker build图像上交叉编译tensorflow-serving

来自分类Dev

在Musl 1.2.0上交叉编译rust项目时,“对__stat_time64的未定义引用”

来自分类Dev

设置Go进行交叉编译时出错

来自分类Dev

使用CMake GUI设置交叉编译器文件

来自分类Dev

与CMake交叉编译时的Makefile生成器规范

来自分类Dev

如何在Ubuntu for Win32上交叉编译Clang?

来自分类Dev

交叉编译iothub sdk时出现链接错误

来自分类Dev

CMake交叉编译目标路径

来自分类Dev

CMake交叉编译目标rpath

来自分类Dev

交叉编译中的CMake CMAKE_AUTOMOC

来自分类Dev

在OS X上交叉编译gcc失败:无法计算目标文件的后缀:无法编译

来自分类Dev

Nim交叉编译到C

来自分类Dev

Config.cmake Rasberry pi交叉编译设置中缺少错误

来自分类Dev

将cmake与工具链文件交叉编译时如何使用find_package?

来自分类Dev

与CMake交叉编译时如何确定主机操作系统?

来自分类Dev

交叉编译时,CMake的link.txt中的链接器命令应该是什么?

来自分类Dev

找不到CMAKE交叉编译库

来自分类Dev

在Windows上交叉编译Golang程序时将环境变量限制为只能命令

来自分类Dev

在Linux主机上交叉编译Windows可执行文件

来自分类Dev

如何在x64主机上交叉编译AArch64的LLVM / Clang?

来自分类Dev

如何在ipad mini 3上交叉编译iOS8.x的clang / llvm 3.7.0?

来自分类Dev

在Linux 64位上交叉编译Windows 64位程序集

来自分类Dev

CMake C ++在编译时设置标头DEBUG变量?

来自分类Dev

使用Build.scala进行交叉编译时,如何为每个Scala版本设置不同的scalacOptions?

来自分类Dev

CMake编译时定义

来自分类Dev

如何从Windows交叉编译到Linux?

Related 相关文章

  1. 1

    在MAC上交叉编译C时出现libcurl问题

  2. 2

    在ARM上交叉编译ImageMagick

  3. 3

    在ubuntu上交叉编译Boost 1.57.0 for arm

  4. 4

    当副本包含空格时,如何使用bazel在docker build图像上交叉编译tensorflow-serving

  5. 5

    在Musl 1.2.0上交叉编译rust项目时,“对__stat_time64的未定义引用”

  6. 6

    设置Go进行交叉编译时出错

  7. 7

    使用CMake GUI设置交叉编译器文件

  8. 8

    与CMake交叉编译时的Makefile生成器规范

  9. 9

    如何在Ubuntu for Win32上交叉编译Clang?

  10. 10

    交叉编译iothub sdk时出现链接错误

  11. 11

    CMake交叉编译目标路径

  12. 12

    CMake交叉编译目标rpath

  13. 13

    交叉编译中的CMake CMAKE_AUTOMOC

  14. 14

    在OS X上交叉编译gcc失败:无法计算目标文件的后缀:无法编译

  15. 15

    Nim交叉编译到C

  16. 16

    Config.cmake Rasberry pi交叉编译设置中缺少错误

  17. 17

    将cmake与工具链文件交叉编译时如何使用find_package?

  18. 18

    与CMake交叉编译时如何确定主机操作系统?

  19. 19

    交叉编译时,CMake的link.txt中的链接器命令应该是什么?

  20. 20

    找不到CMAKE交叉编译库

  21. 21

    在Windows上交叉编译Golang程序时将环境变量限制为只能命令

  22. 22

    在Linux主机上交叉编译Windows可执行文件

  23. 23

    如何在x64主机上交叉编译AArch64的LLVM / Clang?

  24. 24

    如何在ipad mini 3上交叉编译iOS8.x的clang / llvm 3.7.0?

  25. 25

    在Linux 64位上交叉编译Windows 64位程序集

  26. 26

    CMake C ++在编译时设置标头DEBUG变量?

  27. 27

    使用Build.scala进行交叉编译时,如何为每个Scala版本设置不同的scalacOptions?

  28. 28

    CMake编译时定义

  29. 29

    如何从Windows交叉编译到Linux?

热门标签

归档