Может ли CMake использовать g для компиляции файлов C?

#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)