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

标签 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++ 时,我的整个项目都不再构建并失败并出现错误:

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。

任何帮助将不胜感激!如果我错过了一些简单的事情,我深表歉意!

最佳答案

Is there some alternative piece of code I should include to create the missing variable CMAKE_C_COMPILE_OBJECT?

不,正如 CMake 错误所述,这是一个“内部 CMake 变量”,应该由 CMake 初始化。这不是您必须自己设置的东西。它应该在您调用 project() 时间接设置。但是,您只在 project() 命令中告诉 CMake 您正在使用 C++(使用 CXX 选项)。如果你想让 CMake 使用 C 和 C++,你需要同时添加:

project(${project} LANGUAGES C CXX)

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

project(${project})

关于c++ - 如果没有带有 LANGUAGE CXX 的 set_source_files_properties,CMake 将无法构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58754964/

相关文章:

c++ - 我怎么知道按钮是否被拨动?

c++ - 使用yaml-cpp解析YAML文件

C++ 引用字节数组

c - 为什么将 sizeof 运算符应用于外部变量不输出 0

c - 如何在我的代码中实现二维指针数组来满足要求?

c - 将程序返回到预触发状态

linux - 同一 sed 命令上的两个模式匹配

linux - 将 TrueType 字形转换为 PNG 图像?

c++ - 何时删除动态分配的内存

c# - 在 Linux 下编译的 Mono 应用程序在 Windows 中无法运行