2011-09-12 26 views
6

Gần đây tôi đã nhập khẩu một C++ tập tin vào dự án obj của tôi mà tôi muốn sử dụng. Trong lớp tôi muốn sử dụng nó trong tôi thay đổi tên tập tin từ MyClass.m thành MyClass.mm.chuyển đổi .mm gây những biểu tượng Không xác định lỗi i386 kiến ​​trúc

Việc làm này mang lại cho tôi 20 hoặc lâu hơn lỗi. Chính xác những lỗi này có ý nghĩa gì và làm cách nào tôi có thể thay đổi MyClass thành lớp C++ mục tiêu để tạo điều kiện cho lớp C++ mới mà tôi muốn sử dụng mà không gặp phải các lỗi này?

Undefined symbols for architecture i386: 
    "setAudioInputIsStereo(audiosourceobj*, bool)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
    "setAudioInputFrameCount(audiosourceobj*, int)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
    "setAudioInputSendValue(audiosourceobj*, int)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
    "getPointerToAudioLeftBuffer(audiosourceobj*)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
    "getPointerToAudioRightBuffer(audiosourceobj*)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
    "freeAudioBuffers(audiosourceobj*)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
     -[Engine clearAudioInput:pid:] in Engine.o 
     -[Engine reset] in Engine.o 
    "setAudioInputReadPoint(audiosourceobj*, int)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
    "setAudioInputHasAudio(audiosourceobj*, bool)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
     -[Engine reset] in Engine.o 
     -[Engine setAudioPath:channel:pad:] in Engine.o 
    "setAudioInputState(audiosourceobj*, int)", referenced from: 
     -[Engine extractMp3Audio:withChannelId:withPadId:] in Engine.o 
     -[Engine clearAudioInput:pid:] in Engine.o 
     -[Engine reset] in Engine.o 
     -[Engine setAudioPath:channel:pad:] in Engine.o 
    "initAudioInputHasAudio(audiosourceobj*, signed char)", referenced from: 
     -[Engine clearAudioInput:pid:] in Engine.o 
     -[Engine reset] in Engine.o 
    "initAudioInputReadPoint(audiosourceobj*, int)", referenced from: 
     -[Engine clearAudioInput:pid:] in Engine.o 
     -[Engine reset] in Engine.o 
    "initAudioInputFrameCount(audiosourceobj*, int)", referenced from: 
     -[Engine clearAudioInput:pid:] in Engine.o 
     -[Engine reset] in Engine.o 
    "initAudioInputSampleToAction(audiosourceobj*, int)", referenced from: 
     -[Engine clearAudioInput:pid:] in Engine.o 
     -[Engine reset] in Engine.o 
    "newChannelOBJ()", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "setVolume(channelobj*, float)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "setMute(channelobj*, int)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "setNumberOfInputs(channelobj*, int)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "setChannelID(channelobj*, int)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "createInputs(channelobj*, int)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "setBufferSize(channelobj*, float)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "createChannelEQS(channelobj*)", referenced from: 
     setUpChannels(int, int)in Engine.o 
    "actionupdatecomplete(audiosourceobj*, objc_object*)", referenced from: 
     channelMixerCallback(void*, unsigned long*, AudioTimeStamp const*, unsigned long, unsigned long, AudioBufferList*)in Engine.o 

Trả lời

19

Âm thanh như chức năng của bạn có liên kết C, nhưng bạn chưa khai báo đúng cách trong tiêu đề của chúng. Vì vậy, một tập tin .mm (Objective-C++) sẽ xem chúng và giả sử liên kết C++. Việc sửa chữa đơn giản nhất là để bọc rằng #include tuyên bố trong thích hợp extern khối:

extern "C" { 
    #include "..." 
} 

Một giải pháp tốt hơn là để làm điều đó trong tiêu đề riêng của mình:

#if defined(__cplusplus) 
    extern "C" { 
#endif /* defined(__cplusplus) */ 

extern void whatever(void); 
extern int foobar(double); 
... 

#if defined(__cplusplus) 
    } 
#endif /* defined(__cplusplus) */ 

Apple sử dụng macro cho điều này, độc đáo mang tên __BEGIN_DECLS__END_DECLS nhưng chúng không chuẩn nên bạn không thể sử dụng chúng trực tiếp trong các tệp được chia sẻ trên các nền tảng.

+0

cảm ơn. Tất cả mọi thứ bạn đăng trong câu trả lời này là thương hiệu mới với tôi – dubbeat

+0

Bạn nên đọc trên C++ trước khi bắt đầu sử dụng nó. Những điều như thế này có thể trở lại để cắn bạn sau này nếu bạn làm cho họ sai. –

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