在OSX 10.9上使用Macports - 使用-stdlib=libstdc++进行编译

7
在OSX 10.9中,clang++的默认选项是使用libc++,这也是Macport在构建软件包时使用的选项。有没有办法告诉Macports使用libstdc++呢?
特别是我想通过Macports构建OpenCV,以便它使用libstdc++,但我想我将遇到需要这样做才能处理其他软件包的情况。

你为什么想要这样做? - rubenvb
否则我的构建将会出错。我的主要编译器是g++,我使用的其他库很可能也依赖于libstdc++。简而言之,我已经在OSX 10.8上成功构建了相同的代码,我看到的唯一区别是我10.9机器上的OpenCV依赖于libc++,而在10.8机器上依赖于libstdc++。 - Puchatek
为什么你的构建会失败?可能是你的任何代码、libstdc++或libc++中出现了问题。 - rubenvb
当然可能会。这是我所知道的-相同的代码在OS X 10.8上构建,但在与未定义符号链接时在10.9上中断。无法链接的库是OpenCV,但我知道它存在,lib路径设置等。查看OpenCV库链接到的内容,两台机器之间唯一的区别是在10.8上OpenCV链接到libstdc++,而在10.9上链接到libc++。此外,在未定义的OpenCV符号之后的错误都涉及到std :: strings系列,这是libstdc ++和libc++冲突的常见症状。 - Puchatek
当然,你需要使用libc++重新编译OpenCV。它们不是二进制兼容的... - rubenvb
阅读MacPorts开发列表 - 实际上,您需要坚持使用一个标准库,并且所有的MacPorts都是使用clang和libc++构建的,因此您使用这些将更加容易。 - mmmmmm
2个回答

4
选项很简单:-stdlib=libstdc++ 如果你需要更好地控制各个端口的构建过程,你可以设置变量,如:CXX = "clang -std=c++11 -stdlib=libc++"CXXFLAGS = "-Wall -O2 -march=core2"等。
然后从源代码构建<port>
sudo port -s install <port> -universal \  
configure.cc="${CC}" configure.cxx="${CXX}" \  
configure.cflags="${CFLAGS}" configure.cxxflags="${CXXFLAGS}"

另一个选择是安装gcc48(或更高版本)端口,并将其用作编译器。不要使用旧版Xcode附带的gcc-4.2.1。它很差劲。

2
奇怪的是,Macports接受这些选项,但并不遵守它们。我移除了OpenCV库,使用带有-stdlib=libstdc++的CXX标志构建它,但仍然构建的库链接到libc++。 - Puchatek

2

有一种方法是从源代码构建opencv,并使用configure.cxx_stdlib变量来指定libstdc ++作为您的C ++运行时库。

尝试以下操作:

sudo port install -s opencv configure.cxx_stdlib="libstdc++"

啊啊,抱歉,我已经换了工作,甚至无法检查您的答案是否解决了问题>< - Puchatek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接