如何使用 GCC-MP-4.7 在 OS X 上编译 ASL?

Posted

技术标签:

【中文标题】如何使用 GCC-MP-4.7 在 OS X 上编译 ASL?【英文标题】:How to compile ASL on OS X using GCC-MP-4.7? 【发布时间】:2012-06-21 18:28:23 【问题描述】:

我在运行 Lion 的 Mac 上编译 Adobe Source Libraries (ASL) 时遇到了各种麻烦。我正在使用 MacPorts GCC-4.7(我喜欢 C++11)。

我下载并编辑了 asl_1.0.43_net_setup.sh,将 url 更改为指向 downloads.sourceforge.net。

我告诉 bjam 使用我的 gcc 并通过编辑 ~/user-config.jam 将 -std=c++11 标志传递给它:

import toolset : using ; using darwin ;
using gcc
    : 47 
    : g++-mp-4.7 
    : <cxxflags>"-std=c++11"
    ;

我用标志告诉 bjam 制作 64 位版本: bjam 工具集=gcc-47 -j 4 地址模型=64 架构=x86

我不断收到错误消息(多次): 文档/示例/命名空间.cpp:1:0:错误:您选择的 CPU 不支持 x86-64 指令集

即使我告诉它使用 64 位,bjam(愚蠢地)似乎正在设置 -march=i486 并导致上述问题。理想情况下,ASL 可以使用我现有的已安装 boost 和 TBB 进行编译,而无需构建自定义版本。

到目前为止,我已经花了几个小时,准备扔掉它。它似乎有很多希望,但构建系统不灵活(这就是我不使用 jam 或 bjam 的原因)。

有没有人有任何关于在现代 Mac 上使用 clang 或 GCC 构建这个东西的提示? (GCC:不是 XCode 自带的版本)。

[编辑] 我找到了 i486 位并将其删除。现在我遇到了用 C++11 编译器编译的问题:

./adobe/closed_hash.hpp:691:88: error: 'insert' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
./adobe/closed_hash.hpp:691:88: note: declarations in dependent base    'adobe::version_1::closed_hash_set<adobe::pair<adobe::version_1::name_t, adobe::version_1::any_regular_t>, adobe::get_element<0, adobe::pair<adobe::version_1::name_t, adobe::version_1::any_regular_t> >, boost::hash<adobe::version_1::name_t>, std::equal_to<adobe::version_1::name_t>, adobe::version_1::capture_allocator<adobe::pair<adobe::version_1::name_t, adobe::version_1::any_regular_t> > >' are not found by unqualified lookup
./adobe/closed_hash.hpp:691:88: note: use 'this->insert' instead

[edit] 嗯,这实际上看起来像是 adobe 代码中的一个错误,g++ 曾经允许,但现在不再允许了。叹息,现在看起来 ASL 还没有针对任何现代的(大部分)兼容的 C++11 编译器进行编译。

现在我在 adobe 脚本下载的 boost 版本中看到编译问题(信号库显然在某些移动构造函数中存在错误,而 GCC 正在抱怨它):

../boost_libraries/boost/smart_ptr/shared_ptr.hpp:168:25: note: 'boost::shared_ptr<boost::signals::detail::basic_connection>::shared_ptr(const boost::shared_ptr<boost::signals::detail::basic_connection>&)' is implicitly declared as deleted because 'boost::shared_ptr<boost::signals::detail::basic_connection>' declares a move constructor or move assignment operator

【问题讨论】:

RE:GCC 4.7 和 C++11,从 llvm.org(不是 Apple Clang 3.1)最近发布的 clang 3.1 开始,clang 实际上支持 slightly more of C++11,并且 libc++ 有更完整的 C+ +11 图书馆。 好的,通过编辑 jamroot.jam 并删除设置“march=i486”的违规选项,我更进一步。文件 jamroot.jam 有一个条目 gcc,multi:i486 我替换为 gccmulti @bames53 谢谢。我实际上已经安装了 clang-3.2 并且也在使用它。我认为让它用 GCC 编译会更容易第一步,但如果你用 clang 完成了它,请发布你的结果。 【参考方案1】:

我已经放弃尝试找出 bjam 引入的所有复杂性。

相反,我在 ASL 的 github 上创建了一个分支,我正在使用 cmake、gcc-47 和 clang-3.2 构建它。我在代码中做了一些小修复,并且其中一个目录在没有警告的情况下编译。

https://github.com/tfiner/adobe_asl

[edit] 经过几个小时的努力,我终于有了两个由 clang 3.2 使用 boost 1.49、TBB 4.0 和 OS X 10.6 构建的闪亮库。随意从 github 克隆它,如果你设法让它工作,请告诉我。

【讨论】:

以上是关于如何使用 GCC-MP-4.7 在 OS X 上编译 ASL?的主要内容,如果未能解决你的问题,请参考以下文章

mac os x yosemite下如何编译milton?

sh 在OS X上编译来自@tihmstar的futurerestore

C++ 在 Mac OS X 上编译代码并在 Linux x86 上运行

通过命令行在 OS X 上编译简单的 Hello World 程序

Mac OS X上编写 ASP.NET vNextKRE环境搭建

从命令行使用 clang 编译:兼容性问题 mac os X