CMake не будет собираться без set_source_files_properties с LANGUAGE CXX - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть небольшая библиотека, которую я сделал (в основном, обертки для более тупой библиотеки внизу), которую я компилировал и не использовал никаких проблем в отдельном проекте. Сейчас я использую эту библиотеку в другом проекте и попытался соответствующим образом изменить CMakeLists.txt (см. Ниже).

cmake_minimum_required (VERSION 3.5)

set(project "foobar")

project(${project} LANGUAGES CXX)

set(${project}_VERSION_MAJOR 0)
set(${project}_VERSION_MINOR 1)

add_library(${project} SHARED
./driver/foo.h
./driver/foo.c
./bar.cpp
./bar.hpp)

set_source_files_properties(./driver/foo.c PROPERTIES LANGUAGE CXX)

target_compile_features(${project}
  PUBLIC
  cxx_std_11)

target_include_directories(${project} PUBLIC ./driver/ .)

 set_target_properties(${project} PROPERTIES LINKER_LANGUAGE CXX)

add_executable(bno055-test
./testingProject.cpp
)

target_link_libraries(test ${project})

install(
  TARGETS ${project}
  RUNTIME DESTINATION bin)

Ошибка, с которой я столкнулся, связана со строкой set_source_files_properties(./driver/foo.c PROPERTIES LANGUAGE CXX). Когда дело доходит до компиляции этого файла C с указанным выше флагом C ++, я получаю много предупреждений типа clang-8: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]. Это ожидаемо, так как я использую устаревшие методы и не должен компилировать этот файл с использованием флага C ++. Однако всякий раз, когда я удаляю эту строку или изменяю ее, чтобы указать C вместо C ++, мой весь проект больше не собирается и завершается с ошибкой:

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_C_COMPILE_OBJECT
-- Generating done
CMake Generate step failed.  Build files cannot be regenerated correctly.
Makefile:283: recipe for target 'cmake_check_build_system' failed
make: *** [cmake_check_build_system] Error 1
"/usr/bin/make -j4 all" terminated with exit code 2. Build might be incomplete.

Я недостаточно знакомс CMake, чтобы увидеть, почему эта строка кода и ошибки связаны следующим образом. Есть ли какой-то альтернативный фрагмент кода, который я должен включить, чтобы создать отсутствующую переменную CMAKE_C_COMPILE_OBJECT?

Я предполагаю, что когда я изначально создавал этот проект с использованием Eclipse, эта строка была автоматически сгенерирована, и мне неясно, почему она сейчассоздает проблему, когда я компилировал эти файлы с тем же CMakeLists.txt раньше (без ссылок на библиотеки).

Это с clang@8.0.0 в Ubuntu 16.04.

Любая помощь будетбыть высоко ценится! Извиняюсь, если я пропустил что-то простое!

1 Ответ

0 голосов
/ 07 ноября 2019

Есть ли какой-нибудь альтернативный фрагмент кода, который я должен включить, чтобы создать отсутствующую переменную CMAKE_C_COMPILE_OBJECT?

Нет, поскольку, как говорится в сообщении об ошибке CMake, это " внутреннийCMake переменная", которая должна быть инициализирована CMake. Это не то, что вы должны установить сами. Это должно быть установлено косвенно, когда вы звоните project(). Однако вы только сообщаете CMake, что используете C ++ (с опцией CXX) в команде project(). Если вы хотите, чтобы CMake использовал C и C ++, вам нужно добавить оба:

project(${project} LANGUAGES C CXX)

Еще лучше, CMake по умолчанию включает C и C ++, поэтому вы можете просто сделать:

project(${project})
...