Мне нужно скомпилировать сгенерированный код 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>
- Используйте
-Wa -q
флаги в соответствии с этим ответом : https://stackoverflow.com/a/19339870/3684931 (Я сделал ошибку. Должно быть-Wa, -q
)
Флаг недействителен.
clang: error: unknown argument: '-q'
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
- Используйте
-Wa,-q
флаги как за этот ответ: https://stackoverflow.com/a/19339870/3684931
Флаг по-прежнему недействительным.
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
clang: error: unsupported argument '-q' to option 'Wa,'
Как мне это построить?
Ваше лучшее решение состоит в том, чтобы скомпилировать все файлы, как если бы они были C++. Одной из проблем является манипулирование именами. –
Идите в трудный путь: оберните C++ в библиотеку, используя C++ и выставляя только C-функции. –
Вам нужно убедиться, что сгенерированный код C таков, что он подходит для компилятора C++, потому что если вы включаете заголовки C++, вы должны использовать C++ для компиляции. Ошибка из 'clang' сообщает вам, что вы (возможно) назначаете строковый литерал для символа' char * 'вместо' const char * ', который C++ не разрешает. Несоответствующий ассемблер озадачен; это может означать, что ваша установка GCC нарушена. –