2011-01-15 28 views
6

Tôi đang gặp một số vấn đề rất lạ với thư viện tăng cường tĩnh (Boost 1.45.0-2 từ MacPorts, được biên dịch thành thư viện chất béo/phổ quát (x86/x86_64)) trong Mac OS X 10.6.6 với GCC 4.5.Mac OS X và libs tăng tĩnh -> std :: string fail

Các thông báo lỗi là

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) 

và một chút nhỏ của mã ví dụ mà sẽ kích hoạt vấn đề này:

#define BOOST_FILESYSTEM_VERSION 3 
#include <boost/filesystem.hpp> 
#include <iostream> 

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

Vấn đề này luôn luôn xảy ra khi liên kết các thư viện tăng tĩnh vào nhị phân. Tuy nhiên, việc liên kết động sẽ hoạt động tốt.

Thậm chí biết thêm thông tin: các phiên bản

gcc kiểm tra/sử dụng: của Apple GCC 4.2.1 (công trình/chạy), MacPorts GCC 4.5.2 (thất bại)

cờ kiểm tra/sử dụng: none, -fPIC, -fPIC -g, -fPIC -g -ggdb3 -gdwarf-2 -O0

đầu ra gdb với MP GCC 4.5.2/bất kỳ cờ ở trên:

(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 

Có vẻ như nó hoạt động tốt với phiên bản GCC của Apple (khá cũ), nhưng lại không thành công với phiên bản GCC mới do MacPorts tạo.

otool -L ctest:

./../../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) 

Tôi đã nhìn thấy báo cáo khác nhau cho một lỗi OS X tương tự khá với GCC 4.2 và tập vĩ mô _GLIBCXX_DEBUG, nhưng điều này có vẻ còn chung chung hơn, như Tôi không sử dụng XCode, cũng không phải thiết lập macro (thậm chí không xác định nó không giúp đỡ. Tôi đã thử nó chỉ để đảm bảo nó thực sự không liên quan đến vấn đề này.) Dường như không liên quan gì đến vấn đề này, cùng một mã đang làm việc tốt với GCC của Apple.

Vì GCC của Apple không bao gồm bất kỳ tính năng C++ 0x nào, tôi thực sự muốn sử dụng phiên bản GCC hiện tại ổn định.

Có ai có bất kỳ gợi ý nào về lý do điều này xảy ra hoặc thậm chí có thể là giải pháp (thay vì sử dụng thư viện động)?

Trân trọng,

Mihai

+0

phiên bản tăng nào? –

+0

Tôi đã cập nhật bài đăng khá một chút và thêm thông tin quan trọng mới. :) – Ionic

+0

Phiên bản nào của GCC và libstdC++ được sử dụng để biên dịch Boost? Nếu đó là những gì được cung cấp bởi Apple, tôi đặt cược nó không tương thích nhị phân với GCC từ MacPorts. – leedm777

Trả lời

7

Vấn đề là Boost đã được xây dựng sử dụng của Apple GCC 4.2.1, trong khi tôi đã và đang xây dựng các dự án sử dụng một trình biên dịch khác nhau.

Vì tôi đã thử liên kết các thư viện Boost tĩnh, cũng như libstdC++ GCC 4.2.1 được đưa vào nhị phân. Tuy nhiên, đồng thời phiên bản GCC khác đang liên kết trong libstdC++ của nó và các vấn đề về không gian tên là vốn có, do đó các hàm sai được gọi và tương tự.

Sửa chữa đơn giản nhất là xây dựng lại Boost với phiên bản GCC đích của bạn và thử lại việc xây dựng chương trình của bạn (bằng cách sử dụng Boost tự xây dựng.)

Được cảnh báo: không cố gắng thay đổi trình biên dịch MacPorts sử dụng để xây dựng Boost (thậm chí không dễ dàng), hoặc có thể xảy ra sự cố hệ thống. Thay vào đó, hãy tự mình xây dựng Boost.

+0

Bạn có thể thấy rằng otool cho thấy rằng nó sử dụng libstdC++ trong/opt không phải là hệ thống rộng. – ismail

+0

Xin chào các bạn. Tôi đang cố gắng để có được phiên bản ổn định mới nhất của gcc 4.5.2 chạy trên máy tính để bàn 10.6.6 của Mac OS. Thông tin về xây dựng gcc cho bản phát hành Mac OS X mới nhất là khan hiếm (trang gcc liệt kê thành công cho 10.5). MacPorts là con đường để đi? Cảm ơn! –

+0

Có, chỉ cần sử dụng MacPorts để biên dịch và cài đặt các bản phát hành GCC mới hơn. Họ sẽ bỏ lỡ tất cả các phần mở rộng của Apple, nhưng làm việc tốt nếu không. – Ionic