Ошибка Apple Mach-O Linker, из-за расширения файла - PullRequest
2 голосов
/ 12 февраля 2012

Страшная типичная ошибка компоновщика.

ld: символ (ы) не найден для архитектуры armv6 collect2: ld вернул 1 статус выхода

Однако, это вызвано именем файла? Я использую C ++ / Objective-C, поэтому все мои файлы Obj-C имеют формат .mm, но я никогда не могу использовать любые файлы .c. Например, я включил алгоритм SFMT в свой проект, который выдавал мне эти ошибки, но просто изменив один файл .c на .cpp, он исчез, и код работает просто отлично! Я включаю только заголовки, поэтому я не уверен, почему это имеет какое-либо значение.

Проблема сейчас в том, что я пытаюсь включить Freetype2, давая мне ту же проблему (почти наверняка, потому что это .c), но она слишком велика, чтобы переименовывать каждый файл, и я также использую связанный двоичный файл поэтому, если я не перекомпилирую его с новыми именами файлов, я не смогу это изменить. Так что теперь пришло время найти настоящую причину этого.

Есть идеи, почему это произошло? Как я могу остановить ошибки компоновщика для .c файлов?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012

Оберните элементы Freetype в директиву extern "C":

// Non-C includes
#include <iostream>

extern "C"
{
    #include <freetype/freetype.h>
    // ... Other freetype includes
}

Возможно, вы можете использовать #import вместо #include в директиве extern "C".Я никогда не пробовал, но я не понимаю, почему это не сработает.

0 голосов
/ 12 февраля 2012

Окружите свой заголовочный файл c этим.Это также может включать в себя:

#ifdef __cplusplus   
extern "C" {         
#endif     

// function declarations etc if this is your own header.
// OR you can use this in the .mm file to surround your include.
//...

#ifdef __cplusplus       
};                       
#endif   

Указывает внешнюю связь для ваших функций c.Если вы не сделаете этого, когда включите ваши файлы .h., Компилятор C ++ будет работать иначе, чем компилятор C.компилятор, использующий искажение функций в стиле C.

...