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,也未设置宏(甚至取消定义它无济于事。我只是为了确保它确实与此问题无关。) s>似乎根本与该问题无关,因为相同的代码在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。