【问题标题】:Macports on OSX 10.9 - compile opencv with libstdc++OSX 10.9 上的 Macports - 使用 libstdc++ 编译 opencv
【发布时间】:2014-08-27 07:56:33
【问题描述】:

我的情况与this thread 中讨论的情况非常相似。我想这样做的原因是我将 OpenCV 与 CUDA 6.0 一起使用,但 CUDA 目前与 libstdc++ 链接。我遵循了建议放置标志-stdlib=libstdc++ 的答案以及我们设置CXXCXXFLAGS 的另一种方法,但正如它所评论的那样:Macports 似乎没有承认这些标志,并且仍然使用 libc++ 而不是预期的 libstdc++。

我想对该线程发表评论以要求跟进,但不幸的是我还没有足够的声誉。

有谁知道如何让 Macports 用 libstdc++ 安装 OpenCV?

编辑 1: 我没有回去检查下面提供的答案之一是否有效。使用 libstdc++ 编译 OpenCV 会导致其他一些主要使用 libc++ 的非 CUDA 项目出现问题,因此我不太可能尝试。但是,如果有人可以在下面尝试答案并在可行时对我发表评论,我会接受答案。

已编辑 2: 这个问题不再适用于我的情况,因为 CUDA 7.0 RC 默认支持 libc++。我仍然会接受每个 Edited 1 的答案。

【问题讨论】:

  • 重新考虑我给出的答案,可能需要使用 gcc-4.8.2 端口,并将gcc -std=c99 和/或g++ -std=c++11 作为CCCXX 变量传递。您还需要确保使用 libstdc++ 构建任何依赖项。 port rdeps OpenCV 列出了 很多 个包,不幸的是,其中一些包含 C++ 组件。

标签: opencv osx-mavericks macports libstdc++ libc++


【解决方案1】:

如果 CUDA 链接到 /usr/lib/libsdtd++.6.dylib,那么您不能使用其他答案中指示的 macports-gcc 端口,因为这样做会导致 CUDA 使用与 OpenCV 不同的 C++ 运行时,OpenCV 可以导致问题。

如果您有全新安装的 MacPorts,您可以编辑 macports.conf 并将您的安装设置为使用 libstdc++ 而不是 libc++。只需编辑 /opt/local/etc/macports.conf 以包含以下行:

cxx_stdlib libstdc++

请注意,这样做意味着您将无法访问需要 C++11 或更新功能的端口。

另请注意,libstdc++ 已弃用,MacPorts 不支持正式支持它在 Mavericks 及更高版本中的使用。

【讨论】:

    【解决方案2】:

    在 boost 的情况下,我能够像这样强制 MacPorts 链接到 libstdc++:

    sudo port -s install boost configure.cxx_stdlib="libstdc++" configure.compiler="macports-gcc-4.7"
    

    就是这样!显然没有必要自己传递“-stdlib=libstdc++”。 otool -L 显示了我希望看到的内容:

    $ otool -L /opt/local/lib/libboost_date_time-mt.dylib
    /opt/local/lib/libboost_date_time-mt.dylib:
            /opt/local/lib/libboost_date_time-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
            /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.18.0)
            /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
            /opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    

    【讨论】:

    • MacPorts dev here – 如果有的话,这是正确的答案。注意不需要强制使用MacPorts GCC,设置configure.cxx_stdlib 就足够了。请注意,这样做可能会破坏依赖包,但您可能已经意识到这一点。
    • 我不同意。原始报告指出“CUDA 当前与 libstdc++ 相关联”... WHICH libstdc++ 与它相关联?如果它链接到主机 libstdc++,那么你不应该链接到主机 libstdc++ 和 MacPorts libstdc++ 并期望在 CUDA 和 OpenCV 之间传递对象。
    猜你喜欢
    • 2016-04-04
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多