如何使用 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 有一个条目我已经放弃尝试找出 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?的主要内容,如果未能解决你的问题,请参考以下文章
sh 在OS X上编译来自@tihmstar的futurerestore
C++ 在 Mac OS X 上编译代码并在 Linux x86 上运行
通过命令行在 OS X 上编译简单的 Hello World 程序