【问题标题】:Can CMake specify the base SDK on Mac OS X?CMake 可以在 Mac OS X 上指定基础 SDK 吗?
【发布时间】:2012-04-27 06:20:16
【问题描述】:

有谁知道如何指定要使用 CMake 构建的 Mac OS X SDK?我搜索了cmake mac "base sdk",但什么也没找到。

我正在使用 CMake 生成 Unix makefile。

更新

在我的 10.6 安装中,我看到 /Developer/SDKs 具有以下内容:

  • MacOSX10.4u.sdk
  • MacOSX10.5.sdk
  • MacOSX10.6.sdk

也许我可以让 CMake 以某种方式将这些路径之一传递给编译器?

另外,我的 10.7 安装只有:

  • MacOSX10.6.sdk
  • MacOSX10.7.sdk

这是否意味着它只能为这些平台构建?

更新 2

该死,我才意识到实际上我并没有使用 Xcode——所以这可能会影响一些答案。另外,我现在正在尝试使用 Mac OS X 10.8 开发者预览版(有一些奇怪的结果,请参阅我的答案)。

【问题讨论】:

  • 关于问题的最后一部分,XCode4 不支持为 10.4 或 10.5(PPC 目标)构建目标 - 它仅适用于英特尔。有一些阅读here。这个 StackOverflow 问题 here 讨论了在 10.7 Xcode 4 下构建 10.4 或 10.5。
  • 有趣的一点,感谢您的提醒。

标签: c++ macos cmake


【解决方案1】:

您可以在配置项目时将变量CMAKE_OSX_SYSROOT 设置为所选的SDK。例如:

cmake -DCMAKE_OSX_SYSROOT=/Developer/SDKs/MacOSX10.4u.sdk/ ..

请参阅文档here

另请注意,2.8.8 之前的 CMake 版本执行 not support Xcode 4.3。

【讨论】:

  • 这似乎对我不起作用。我将这个附加到我的 cmake 命令中:-DCMAKE_OSX_SYSROOT=/Developer/SDKs/MacOSX10.7.sdk/——但是,MAC_OS_X_VERSION_10_8 宏仍然被定义。
  • 我也尝试过设置CMAKE_OSX_DEPLOYMENT_TARGET,但这也没有什么不同。
  • 有趣的是,我在 Darwin.cmake 中添加了message("sysroot=${CMAKE_OSX_SYSROOT}"),它确实打印出了我指定的路径。所以你的答案似乎是正确的,但也许 CMake 发生了一些奇怪的事情?
【解决方案2】:

在尝试 sakra 的有效答案(就 CMake 的行为而言有效)失败后,我进行了一番挖掘,发现如果我向编译器指定 --sysroot 标志,它似乎使用了正确的 SDK!

但是,我现在在针对 10.7 编译时看到此错误(我在 10.8 中看不到):

Undefined symbols for architecture i386:
  "_NXArgv", referenced from:
      execSelfNonDaemonized() in libarch.a(CArchDaemonUnix.o)
      CArchDaemonUnix::daemonize(char const*, int (*)(int, char const**)) in libarch.a(CArchDaemonUnix.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [bin/synergyc] Error 1
make[1]: *** [src/cmd/synergyc/CMakeFiles/synergyc.dir/all] Error 2
make: *** [all] Error 2

注意:CArchDaemonUnix 是 Synergy(我正在开发的一个开源项目)中的一个类。

更新:

刚刚在我的 10.6 安装中尝试过此操作,但在尝试为 10.5 编译时遇到了链接器错误——原来您还需要指定 MACOSX_DEPLOYMENT_TARGET 环境变量!

无论如何,这是我在 Mountain Lion (OSX 10.8) 上运行以编译 10.7 时所做的:

命令行:

MACOSX_DEPLOYMENT_TARGET=10.7

cmake -G "Unix Makefiles" -DCMAKE_OSX_SYSROOT=/Developer/SDKs/MacOSX10.7.sdk/ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.7 ../..

CMakeLists.txt:

set(CMAKE_CXX_FLAGS "--sysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CXX_FLAGS}")

我希望这对某人有所帮助! :-)

【讨论】:

  • 很高兴看到有人试图修复 Mac 上的协同问题! ;)
  • 这太棒了。作为附加说明,CMake 似乎忽略了是否设置了 CMAKE_OSX_DEPLOYMENT_TARGET,用 MACOSX_DEPLOYMENT_TARGET 中的任何内容覆盖它。前者可能是供 CMake 内部使用的。
  • 像魅力一样工作。谢谢!
【解决方案3】:

在您的 CMakeLists.txt 中添加以下命令

设置(CMAKE_OSX_SYSROOT macosx10.10)

设置(CMAKE_OSX_DEPLOYMENT_TARGET "10.5")

这应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多