2014-09-14 6 views
0

У меня есть проект C/C++, который я начал в Linux, и я хочу его сейчас переносить в MacOS. Проблема, с которой я сталкиваюсь, заключается в следующем:Компиляция кода C/C++ на MacOS

Мой исходный код ссылки на библиотеку C (инструмент abc от https://bitbucket.org/alanmi/abc) и использует файлы заголовков из этой библиотеки. При компиляции в Linux все идет хорошо, но при компиляции на MacOS все ломается. Ошибка я получаю следующее:

abc/src/misc/vec/vecPtr.h:895:33: error: too many arguments to function call, expected 0, have 2 

Это в основном связано с тем, как указатели на функции обрабатываются на двух системах. Как я понял из поиска в Интернете, это то, что в C указатели на функции с пустой скобкой() считаются имеющими переменное количество аргументов, в то время как это не так в C++. Похоже, что g ++ в Linux умеет правильно компилировать такой код, а на MacOS он терпит неудачу.

Может кто-нибудь может помочь с некоторыми сведениями по этому вопросу?

Благодаря

+0

Кажется например, вы пытаетесь скомпилировать код, который должен быть скомпилирован как C с компилятором C++. Было бы полезно использовать «extern» C «{...}' вокруг содержимого в соответствующем заголовочном файле - или использовать gcc вместо g ++. –

+0

Какой компилятор вы используете? И как вы его вызываете? –

+0

Я использую make-файл с неявными правилами. Я попытался настроить CXX на g ++ и CC на gcc, и это не сработало. Я также пытался оставить их в качестве системных значений по умолчанию, но это также не сработало. – AntiClimacus

ответ

1

библиотека объявляет аргументы указателя функции, как это:

int (*Vec_PtrSortCompare)() 

, а затем их вызов, как это:

Vec_PtrSortCompare(p->pArray+i, p->pArray+k-1) 

В C, функции описателя с пустым аргументом list не определяет, сколько аргументов требуется. Таким образом, вы можете юридически передать столько аргументов, сколько хотите этой функции. Однако такие «вариативные» функции считаются устаревшими.

В C++, однако, декларатор функций с пустым списком аргументов указывает, что функция принимает нулевые аргументы.

Это отличие означает, что вы не можете скомпилировать заголовочный файл, подобный этому, с помощью компилятора C++. У вас есть два варианта: вы можете скомпилировать части своей программы с помощью этого заголовка только с компилятором C и создать библиотеку или набор объектных файлов, а затем скомпилировать остальную часть вашей программы с помощью компилятора C++ (если у вас есть части C++).

В качестве альтернативы вы можете исправить объявления функций. Из контекста, представляется, что функции должны быть объявлены как

int (*Vec_PtrSortCompare)(const void **a, const void **b) 

(В правильном C++, это было бы шаблонные функции, чтобы избежать необходимости использовать void *, однако, C не имеют шаблонов.)

+0

Спасибо! Я, наконец, должен был сделать изменения, которые вы предложили вручную, чтобы заставить его работать. – AntiClimacus

Смежные вопросы