#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)
вместо sayproject(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 : компилятор выбирается из расширения файла