#gcc #g #cmake
#gcc #g #cmake
Вопрос:
Я работал над проектом, в котором я использовал g для компиляции кода C в файлах, которые заканчиваются на .c. Причина в том, что мне сказали, что g имеет лучшие предупреждающие сообщения.
Я переключаю процесс сборки для этого проекта на использование CMake. Я обнаружил, что изначально CMake хотел использовать gcc для компиляции файлов C. Это не удалось из-за таких вещей, как объявление переменных во время использования. Итак, я попытался использовать g для компиляции файлов C, используя параметр
set(CMAKE_C_COMPILER_INIT g )
в CMakeLists.txt файл. Но это приводит к сообщению об ошибке:
#error "The CMAKE_C_COMPILER is set to a C compiler"
Я переименовал свои файлы .c в .cpp, чтобы решить эту проблему, поскольку это кажется мне самым простым способом заставить все работать, и, возможно, лучшим способом тоже. Но мне было интересно, можно ли заставить CMake использовать g для компиляции файлов C.
Комментарии:
1. «Причина в том, что мне сказали, что g имеет лучшие предупреждающие сообщения». — И не могли бы вы подтвердить это? Я бы сказал, что это очень сомнительно, потому что (насколько я знаю) оба являются просто драйверами, вызывающими один и тот же компилятор с разными аргументами (язык, включаемые пути, стандартная библиотека, связанная с и т.д.) Кроме того, g не является компилятором C, поэтому в конечном итоге вы пишете очень плохой C .
2. Если вы пишете C, то скомпилируйте с помощью компилятора C. C и C — это не одно и то же.
3. Вы сказали ‘ Это не удалось из-за таких вещей, как объявление переменных во время использования ‘; это звучит так, как будто вы используете GCC в режиме C89 вместо режима C99. Попробуйте добавить
-std=c99
в компилятор C — как-нибудь.4. спасибо за комментарии, я обязательно подумаю над этими предложениями.
Ответ №1:
Вы не должны переопределять компилятор для этой цели. Если вам действительно нужно скомпилировать ваши файлы C как C , тогда вы должны научить cmake, что ваши файлы принадлежат языку C :
set_source_files_properties(filename.c PROPERTIES LANGUAGE CXX )
Комментарии:
1. похоже, то, что я хотел сделать, не лучшая идея, и я должен переименовать файлы в .cpp. Но спасибо за правильный ответ, полезно знать, как сделать то, что я хотел, в случае, если это действительно необходимо.
2. есть идеи, почему применение этого к одному файлу в моем проекте приведет к тому, что все файлы в проекте будут скомпилированы как C ? У меня есть куча файлов .c, и я хочу, чтобы только один из них был скомпилирован как C .
3. @Scorpio, я действительно хочу этот симптом, но определенным образом… Почему у CMake нет способа скомпилировать все файлы .c как C ?
4. Вы можете сделать следующее, чтобы обработать все файлы C и C .
file(GLOB_RECURSE CFILES "${CMAKE_SOURCE_DIR}/*.c") SET_SOURCE_FILES_PROPERTIES(${CFILES} PROPERTIES LANGUAGE CXX )
5. Clang выводит устаревшее сообщение:
clang: warning: treating 'c' input as 'c ' when in C mode, this behavior is deprecated [-Wdeprecated]
Ответ №2:
Чтобы cmake обрабатывал все файлы C как файлы C , используйте:
file(GLOB_RECURSE CFILES "${CMAKE_SOURCE_DIR}/*.c")
SET_SOURCE_FILES_PROPERTIES(${CFILES} PROPERTIES LANGUAGE CXX )
Ответ №3:
Если вам нужно переключить весь проект, задайте это в директиве project:
project(derproject LANGUAGES CXX)
Комментарии:
1. Это нарушает некоторые функциональные тесты, если они используются.
Ответ №4:
set_source_files_properties
Настройкой CMake по (моему) выбору здесь будет set_source_files_properties
команда. https://cmake.org/cmake/help/latest/command/set_source_files_properties.html
set(qpid_dispatch_SOURCES
alloc.c
alloc_pool.c
aprintf.c
amqp.c
atomic.c
# [...]
)
set_source_files_properties(${qpid_dispatch_SOURCES} PROPERTIES LANGUAGE CXX)
add_library(qpid-dispatch OBJECT ${qpid_dispatch_SOURCES})
Как описано в связанных документах, CMake 3.18 изменил область действия set_source_files_properties. Смотрите DIRECTORY
и TARGET_DIRECTORY
параметры. Поэтому, чтобы рекурсивно применить свойство исходного файла ко всем файлам в вашем проекте, ваш CMakeLists.txt
должен выглядеть примерно так
cmake_minimum_required(VERSION 3.20)
project(qpid-dispatch LANGUAGES C CXX)
# [...]
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(router)
# [...]
file(GLOB_RECURSE CFILES "*.c")
set_source_files_properties(${CFILES}
DIRECTORY src tests router
PROPERTIES LANGUAGE CXX)