2015-06-29 3 views
0

Мне нужно скомпилировать сгенерированный код C, который #include s заголовки C++, и заставить его работать на Linux, OS X и Windows. Я сам поставил #include, чтобы иметь возможность взаимодействовать с ним на C++-коде.Как скомпилировать C-код, который # включает код на C++?

Код C, однако, таков, что строгий компилятор будет ловить ошибки, которые может рассматриваться как предупреждения. Я хочу передать их как предупреждения, поскольку большая часть этого кода генерируется, и я не контролирую его.

Вот мои попытки обобщить его (я использую CMake, кстати):

(я использую эти флаги: -Wno-write-strings -Wno-error -fpermissive)

  • Рассматривать весь проект как код C++: работает на Linux (с g++), но на OS XI получить:

С Clang:

error: assigning to 'char *' from incompatible type 'const char *' 

С g++:

/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:18:no such instruction: `vmovdqa LC0(%rip), %xmm3' 
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:19:no such instruction: `vmovdqa LC1(%rip), %xmm2' 
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:20:no such instruction: `vmovdqu (%rsi), %xmm7' 
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:21:no such instruction: `vmovdqu 16(%rsi), %xmm8' 
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:22:no such instruction: `vmovdqa LC2(%rip), %xmm1' 
/var/folders/hf/5dbkbqrx5p3bmnpdqqy4wgpr0000gn/T//ccvMHo2S.s:23:no such instruction: `vpshufb %xmm3, %xmm7,%xmm6' 
  • Treat код C, как C код:

Не находит <atomic>

fatal error: atomic: No such file or directory 
#include <atomic> 

Флаг недействителен.

clang: error: unknown argument: '-q' 
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated 

Флаг по-прежнему недействительным.

clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated 
clang: error: unsupported argument '-q' to option 'Wa,' 

Как мне это построить?

+1

Ваше лучшее решение состоит в том, чтобы скомпилировать все файлы, как если бы они были C++. Одной из проблем является манипулирование именами. –

+3

Идите в трудный путь: оберните C++ в библиотеку, используя C++ и выставляя только C-функции. –

+0

Вам нужно убедиться, что сгенерированный код C таков, что он подходит для компилятора C++, потому что если вы включаете заголовки C++, вы должны использовать C++ для компиляции. Ошибка из 'clang' сообщает вам, что вы (возможно) назначаете строковый литерал для символа' char * 'вместо' const char * ', который C++ не разрешает. Несоответствующий ассемблер озадачен; это может означать, что ваша установка GCC нарушена. –

ответ

1

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

  1. Создание библиотек C, содержащих код C и скомпилировать их в виде кода C (например cc -c your_filename.c будет производить файл с your_filename.o объекта).
  2. Создайте проект на C++ (где вы должны включить все ваши заголовки C, если вы их тщательно продутируете), и используйте компоновщик для ссылки на объектные файлы your_filename.o, которые вы создали на шаге 1, при компиляции этого проекта.
+0

Шаг 1 не был возможен. Пожалуйста, см. Мою вторую попытку в вопросе. –

+0

@SachinHosmani. Ваши 2. попытки состояния вы получаете ошибку с '#include ', но это не C. C имеет атомную поддержку через '#include ', и вам, скорее всего, потребуется включить C11, чтобы сделать это доступным. – nos

+1

@SachinHosmani Так используйте '' в вашем коде на C++, чтобы заблокировать доступ к вашему C-коду, или '' (как @nos сказал) в вашем C-коде. – Sebivor

0

Я положил #includes, чтобы иметь возможность взаимодействовать с кодом C++.

Это место, где вы поступили не так. #include Ввод заголовка C++ из файла .c никогда не будет работать.

Вместо этого вам необходимо создать файлы заголовков, которые совместимы как с C, так и с C++. Эти файлы должны содержать только код в общем подмножестве C и C++; и они должны также содержать:

#ifdef __cplusplus 
extern "C" { 
#endif 

// main header code here 

#ifdef __cpluscplus 
} 
#endif 

, так что модули C++, включая этот заголовок, создают вызовы с использованием C ABI.

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