2010-08-14 32 views
8

Tôi có máy Mac OS X 10.6 tôi đang sử dụng làm máy tính dev của mình. Chương trình tôi đã viết hoạt động hoàn hảo trên máy tính dev. Tuy nhiên, khi tôi cố gắng chạy nó trên một OS X 10.5 (không chắc chắn nếu đó là có liên quan) thử nghiệm máy, nó bị treo khi khởi động.Chương trình OS X chạy trên máy tính dev, bị rơi khủng khiếp trên những máy khác

Đây là lỗi tôi nhận được:.

Process:   MyApp[25908] 
Path:   /Applications/MyApp.app/Contents/MacOS/MyApp 
Identifier:  MyApp 
Version:   ??? (???) 
Code Type:  X86 (Native) 
Parent Process: launchd [109] 

Interval Since Last Report:   17392106 sec 
Crashes Since Last Report:   735 
Per-App Interval Since Last Report: 0 sec 
Per-App Crashes Since Last Report: 8 

Date/Time:  2010-08-14 07:50:09.768 -0700 
OS Version:  Mac OS X 10.5.8 (9L31a) 
Report Version: 6 
Anonymous UUID: 1BF30470-ACF2-46C7-B6D5-4514380965C8 

Exception Type: EXC_BREAKPOINT (SIGTRAP) 
Exception Codes: 0x0000000000000002, 0x0000000000000000 
Crashed Thread: 0 

Dyld Error Message: 
    Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i 
    Referenced from: /Applications/MyApp.app/Contents/MacOS/MyApp 
    Expected in: /usr/lib/libstdc++.6.dylib 

Vì vậy, nó trông giống như nó bị rơi vì nó tải một phiên bản tương thích của thư viện libstdc động ++ 6. Đây là loại điều bình thường? Một tìm kiếm trên Google không thực sự tiết lộ nhiều chương trình khác có vấn đề này. Tôi nên làm gì trong biên dịch của mình để ngăn điều này xảy ra? Tôi có cần phải bằng cách nào đó bao gồm cả libstdC++ bên trong gói ứng dụng của tôi không?

Trả lời

9

Các giải pháp cho vấn đề này là thêm đoạn mã sau vào một trong các file nguồn của bạn:

// Workarounds for symbols that are missing from Leopard stdlibc++.dylib. 
_GLIBCXX_BEGIN_NAMESPACE(std) 
// From ostream_insert.h 
template ostream& __ostream_insert(ostream&, const char*, streamsize); 

#ifdef _GLIBCXX_USE_WCHAR_T 
    template wostream& __ostream_insert(wostream&, const wchar_t*, streamsize); 
#endif 

// From ostream.tcc 
template ostream& ostream::_M_insert(long); 
template ostream& ostream::_M_insert(unsigned long); 
template ostream& ostream::_M_insert(bool); 
#ifdef _GLIBCXX_USE_LONG_LONG 
    template ostream& ostream::_M_insert(long long); 
    template ostream& ostream::_M_insert(unsigned long long); 
#endif 
template ostream& ostream::_M_insert(double); 
template ostream& ostream::_M_insert(long double); 
template ostream& ostream::_M_insert(const void*); 

#ifdef _GLIBCXX_USE_WCHAR_T 
    template wostream& wostream::_M_insert(long); 
    template wostream& wostream::_M_insert(unsigned long); 
    template wostream& wostream::_M_insert(bool); 
    #ifdef _GLIBCXX_USE_LONG_LONG 
     template wostream& wostream::_M_insert(long long); 
     template wostream& wostream::_M_insert(unsigned long long); 
    #endif 
    template wostream& wostream::_M_insert(double); 
    template wostream& wostream::_M_insert(long double); 
    template wostream& wostream::_M_insert(const void*); 
#endif 

// From istream.tcc 
template istream& istream::_M_extract(unsigned short&); 
template istream& istream::_M_extract(unsigned int&); 
template istream& istream::_M_extract(long&); 
template istream& istream::_M_extract(unsigned long&); 
template istream& istream::_M_extract(bool&); 
#ifdef _GLIBCXX_USE_LONG_LONG 
    template istream& istream::_M_extract(long long&); 
    template istream& istream::_M_extract(unsigned long long&); 
#endif 
template istream& istream::_M_extract(float&); 
template istream& istream::_M_extract(double&); 
template istream& istream::_M_extract(long double&); 
template istream& istream::_M_extract(void*&); 

#ifdef _GLIBCXX_USE_WCHAR_T 
    template wistream& wistream::_M_extract(unsigned short&); 
    template wistream& wistream::_M_extract(unsigned int&); 
    template wistream& wistream::_M_extract(long&); 
    template wistream& wistream::_M_extract(unsigned long&); 
    template wistream& wistream::_M_extract(bool&); 
    #ifdef _GLIBCXX_USE_LONG_LONG 
     template wistream& wistream::_M_extract(long long&); 
     template wistream& wistream::_M_extract(unsigned long long&); 
    #endif 
    template wistream& wistream::_M_extract(float&); 
    template wistream& wistream::_M_extract(double&); 
    template wistream& wistream::_M_extract(long double&); 
    template wistream& wistream::_M_extract(void*&); 
#endif 

_GLIBCXX_END_NAMESPACE 

Vấn đề cơ bản là có một số mẫu được khai báo là mẫu extern trong libstdC++ tiêu đề, và trong khi instantiations của họ được cung cấp bởi libstdC++ trên 10.6+, chúng không được libstdC++ cung cấp trên 10.5. Kết quả là, khi bạn đang sử dụng các mẫu này, bạn sẽ kết nối thành công với SDK 10.6 dành cho các chức năng không được cung cấp bởi hệ điều hành 10.5, và do đó, hãy sử dụng chức năng khởi chạy. Bằng cách cung cấp các bản sao cho chính bạn, bạn đảm bảo mã của bạn sẽ tải trên Snow Leopard.

Cách khác, bạn có thể

#define _GLIBCXX_EXTERN_TEMPLATE 0 

trong file prefix của bạn, nhưng làm như vậy sẽ gây ra mẫu mã sưng lên.

+0

Lưu ý rằng bạn sẽ cần phải bao gồm '' để mã trên hoạt động. –

2

Có một vài điểm tôi có thể nghĩ:

  1. Bạn biên dịch nó như là một "phát hành xây dựng"? Việc xây dựng gỡ lỗi có thể không chạy trên các máy khác với máy được biên dịch.

  2. SDK nào bạn đã sử dụng? Bạn đã chỉ định phiên bản hệ điều hành tối thiểu nào trong cài đặt bản dựng? Nếu bạn muốn chạy nó trên 10.5, bạn cần sử dụng 10.5 SDK và/hoặc thiết lập hệ điều hành đích là 10.5. Xem this Apple document để xây dựng cho nhiều phiên bản hệ điều hành.

  3. Máy mục tiêu có DYLD_LIBRARY_PATH đặt thành thứ gì đó không trống không? Nếu không được thực hiện cẩn thận, điều đó có thể gây nhầm lẫn dyld.

Một cách để phân biệt các khả năng khác nhau là chạy ứng dụng của bạn trong máy dev, nhưng với tài khoản riêng không có đặc quyền quản trị từ tài khoản nhà phát triển; sau đó bạn có thể kiểm tra xem nó có chạy trong hộp 10.6 hay không.

+0

Làm lại điểm 1 của bạn: Nếu bản dựng gỡ lỗi dành cho kiến ​​trúc tương thích (ví dụ:, bạn không cố gắng chạy mã Intel trên một máy PowerPC) và không sử dụng ZeroLink (mà tôi không nghĩ là thậm chí có sẵn trên Xcode mới nhất) sau đó xây dựng gỡ lỗi nên làm việc. – JWWalker

+0

Cảm ơn, bạn đã đúng. Đã sửa. – Yuji

0

Tôi chạy vào cùng một vấn đề (xây dựng với GCC 4.2 làm cho mã của tôi không thể thực thi trên OS X 10.5 do lỗi dyld trong libstdC++. 6.dylib).

Giải pháp được Ben Artin đề xuất. Ngoài ra, bạn có thể đặt xác định _GLIBCXX_EXTERN_TEMPLATE thành 0 trước khi thêm bất kỳ tiêu đề nào (nếu bạn đang sử dụng các tiêu đề được biên dịch trước, hãy đảm bảo chúng được biên dịch với tập hợp xác định chính xác).

Các vấn đề liên quan