关于C#:Mac OS X和static boost libs-> std :: string失败

Mac OS X and static boost libs -> std::string fail

我在使用GCC 4.5的Mac OS X 10.6.6下使用静态增强库(MacPorts的Boost 1.45.0-2,编译为胖/通用(x86 / x86_64)库)遇到一些非常奇怪的问题。 >

错误消息是

1
2
3
main(78485) malloc: *** error for object 0x1000e0b20: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
[1]    78485 abort (core dumped)

和少量示例代码将触发此问题:

1
2
3
4
5
6
7
8
#define BOOST_FILESYSTEM_VERSION 3
#include <boost/filesystem.hpp>
#include <iostream>

int main (int argc, char **argv) {
  std::cout << boost::filesystem::current_path ().string () << '\
'
;
}

将静态Boost库链接到二进制文件时,总是会出现此问题。不过,动态链接可以正常工作。

更多信息:

已测试/使用的gcc版本:Apple GCC 4.2.1(正常运行),MacPorts GCC 4.5.2(失败)

已测试/已使用的标志:无,-fPIC,-fPIC -g,-fPIC -g -ggdb3 -gdwarf-2 -O0

gdb输出,带有MP GCC 4.5.2 /上面的任何标志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(gdb) run
Starting program: /Users/ionic/crashtest/bin/ctest  Reading symbols for shared libraries .++++++++++++++++++++++.................................................................................................................. done
ctest(80366) malloc: *** error for object 0x100fe6b20: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT, Aborted. 0x00007fff81a4e616 in __kill ()
(gdb) bt full
#0  0x00007fff81a4e616 in __kill () No symbol table info available.
#1  0x00007fff81aeecca in abort () No symbol table info available.
#2  0x00007fff81a066f5 in free () No symbol table info available.
#3  0x0000000100f763e9 in std::string::_M_mutate () No symbol table info available.
#4  0x0000000100f7644c in std::string::_M_replace_safe () No symbol table info available.
#5  0x0000000100f77edd in std::string::replace () No symbol table info available.
#6  0x000000010000713d in std::string::_M_rep () at /usr/include/c++/4.2.1/bits/basic_string.h:1412
        to = (string &) Cannot access memory at address 0x0

似乎可以与苹果的(相当古老的)GCC版本一起使用,但是在MacPorts的新GCC版本中却表现不佳。

otool -L ctest:

1
2
3
4
5
./../../bin/ctest:
        /opt/local/lib/gcc45/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.14.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 625.0.0)
        /opt/local/lib/gcc45/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

我已经看到各种报告,它们涉及与GCC 4.2和_GLIBCXX_DEBUG宏集相当相似的OS X错误,但由于我既未使用XCode,也未设置宏(甚至取消定义它无济于事。我只是为了确保它确实与此问题无关。)似乎根本与该问题无关,因为相同的代码在Apple的GCC上正常工作。

由于Apple的GCC尚不包含任何C 0x功能,所以我确实想使用当前稳定的GCC版本。

有人能指出为什么会发生这种情况吗,甚至可能有解决方案(而不是使用动态库变通方法)?

最诚挚的问候,

密海


问题在于Boost是使用Apple的GCC 4.2.1构建的,而我一直在使用其他编译器构建该项目。

当我尝试链接静态Boost库时,还将GCC 4.2.1 libstdc放入了二进制文件中。
但是,与此同时,另一个GCC版本正在其libstdc中进行链接,并且名称空间问题是固有的,因此调用了错误的函数等等。

最简单的修复方法是使用目标GCC版本重新构建Boost,然后重试程序的构建(使用自建的Boost。)

请注意:请勿尝试更改MacPorts用于构建Boost的编译器(甚至不容易实现),否则可能会导致系统损坏。相反,您可以自己构建Boost。