如果没有带有LANGUAGE CXX的set_source_files_properties,CMake将无法构建

时间:2019-11-07 18:30:24

标签: c++ c linux cmake shared-libraries

我有一个很小的库(主要是包装下面的更钝的库),我一直在编译它,并且在一个包含的项目中没有任何问题。我现在在另一个项目中使用此库,并尝试适当地更改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 ++时,我的 entire 项目便不再生成并失败并出现错误:

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编译这些文件时(现在没有库链接)它现在会产生问题。

这是在Ubuntu 16.04上的clang@8.0.0。

任何帮助将不胜感激!抱歉,我错过了一些简单的事情!

1 个答案:

答案 0 :(得分:0)

  

我应该包括一些替代代码来创建缺失的变量CMAKE_C_COMPILE_OBJECT吗?

否,因为CMake错误状态指出,这是“ 内部CMake变量”,应由CMake初始化。这不是您应该设置的东西。调用project()时应间接设置。但是,您仅告诉CMake您正在project()命令中使用C ++(带有CXX选项)。如果希望CMake使用C和C ++,则需要同时添加:

project(${project} LANGUAGES C CXX)

更好的是,默认情况下,CMake启用C和C ++,因此您可以执行以下操作:

project(${project})