Смешивание C и C с CMAKE

#c #c #gcc #g #cmake

#c #c #gcc #g #cmake

Вопрос:

В основном мы пишем приложение на C , но некоторые подмодули написаны на C (в Linux). Проблема в том, как записать CMakeLists.txt файлы для использования g в одних подкаталогах и gcc в других.

Ответ №1:

Компилятор и компоновщик обычно определяются расширением файла, если не установлено иное. Таким образом, пока окончания файлов в порядке, ваш код скомпилирован и связан с правильным компилятором.

Кстати, не забудьте сделать правильные объявления extern C, если вы смешиваете C и C .

Комментарии:

1. «если не указано иное», то есть в верхней части CMakeLists.txt , используйте project(myproject) вместо say project(myproject C) .

2. Или изложите это полностью, сказав project(myproject LANGUAGES C CXX) . Включение C и CXX — это поведение CMake по умолчанию, когда вы сами не указываете никаких языков. cmake.org/cmake/help/latest/command/project.html

Ответ №2:

CMake делает это автоматически. Вы можете свободно смешивать оба типа файлов в вашем CMakeLists.txt файл:

 . . .
add_executable(
    my_program
    code.cpp
    more_code.c
)
  

Я делаю это постоянно, и это просто работает.

Комментарии:

1. Обратите внимание, что вам нужны защитные элементы заголовка C. Итак, в code.cpp вы бы сказали extern "C" { #include "more_code.h" }

Ответ №3:

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

 add_executable(MyEXE main.cpp myFile.c)
  

Я хотел бы добавить болезненно тривиальный момент.

В этом случае вы должны убедиться, что ваш проект имеет правильные аргументы названия языка, а именно 1:

 project(MyProject C CXX)
  

Это должно выполняться автоматически при добавлении файла CMake, но в зависимости от порядка добавления файлов аргументы могут включать только C или CXX.

Если бы у вас был только, например, C в качестве языкового аргумента, и ваш int main() был в вашем main.cpp ваша точка входа в программу не будет существовать, и ваш компилятор пропустит ошибку.


1 Или вы можете опустить языковые аргументы, и в этом случае выбираются аргументы C и CXX по умолчанию. Смотрите здесь

Ответ №4:

Вы можете присвоить свойству LANGUAGE ваших исходных файлов значение «CXX». Смотрите документацию.

Комментарии:

1. обновленная ссылка cmake.org/cmake/help/v2.8.8 /…

Ответ №5:

Разница между g и gcc в основном заключается в том, что g передает -lstdc компоновщику. Просто добавьте стандартную библиотеку c в качестве явной зависимости от модулей c .

Чтобы было понятно, gcc может компилировать код на C . gcc и g одинаковы в этом отношении. Разница заключается только в том, что при использовании g вам не нужно явно указывать компилятору ссылаться на libstdc .

Комментарии:

1. Спасибо, я переписал вопрос. Эта часть в порядке, но я хотел бы знать, как указать gcc / g для определенных подкаталогов.

2. Зачем использовать g в некоторых подкаталогах, если вы можете просто использовать gcc и явно зависеть от libstdc , когда это необходимо?

3. @James: gcc может выступать в качестве интерфейса для g : компилятор выбирается из расширения файла