在 CMake 中混合 C 和 C++,什么是 CMakeCCompilerId.c 以及如何丢弃它

2023-12-25

我有一个混合 C 和 C++ 的简单项目(将 C 库包装到 C++ 类中并使其易于在 C++ 项目中使用)。该项目是使用 VisualStudio 构建的,我在 Linux 或 Mac 下,所以我想将其转换为 CMake 项目。

VS项目内容满满的

<ClInclude Include="a_file.h" />

所以我认为该文件只是包含在内,没有任何复杂的构建系统。这是我的 CMakeLists.txt:

cmake_minimum_required(版本2.8)

# project
set(PROJECTNAME "Test")
project(${PROJECTNAME} C CXX)
set (CMAKE_CXX_FLAG "-Wall")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "./")

include_directories(${CMAKE_CURRENT_BINARY_DIR})

find_package(OpenCV REQUIRED)

file(GLOB_RECURSE ${PROJECTNAME}_HEADERS ${CMAKE_SOURCE_DIR}/*.h)
file(GLOB_RECURSE ${PROJECTNAME}_SOURCES ${CMAKE_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE ${PROJECTNAME}_SOURCES ${CMAKE_SOURCE_DIR}/*.c)

include_directories (include)
include_directories (src)

SET(${PROJECTNAME}_SOURCES
    main.cpp
    ${${PROJECTNAME}_SOURCES}
)


ADD_EXECUTABLE(${PROJECTNAME}
    ${${PROJECTNAME}_SOURCES}
    ${${PROJECTNAME}_HEADERS}

)

我知道这不是一个好遵循的规则,但我只需要一种快速而肮脏的方法来使用此代码。

现在,如果我用这个测试 main.cpp 进行:

#include <iostream>
int main(int argc, char *argv[]) {
    std::cout << "main > ." << std::endl;
    return 0;
}

I get a 重复符号CMakeCCompilerId.c 错误

duplicate symbol _main in:
    CMakeFiles/Test.dir/main.cpp.o
    CMakeFiles/Test.dir/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

据我所知,这个 CMakeCCompilerId.c 文件是 cmake 添加的用于处理 C 的文件...

所以,我的问题是:cmake-auto-added CMakeCCompilerId.c 是什么?如何编译一个包含 bot C 和 C++ 的 main 函数的项目?

EDIT:

我只是使用解决了问题

project(${PROJECTNAME} CXX)

代替

project(${PROJECTNAME} C CXX)

但无论如何我很好奇理解它以及 CMake 如何混合这两种语言


The file(GLOB_RECURSE ${PROJECTNAME}_SOURCES ${CMAKE_SOURCE_DIR}/*.c)可能是你的问题的原因。

CMake 对编译器运行一些检查,为此,它会生成一些 .c 文件并将它们保存在构建目录中

如果构建目录是主目录的子目录,则第二次GLOB_RECURSE运行时,它将下降到构建目录中,因此会将这些 cmake 文件添加到 ${PROJECTNAME}_SOURCES 变量中。

如果您的源代码全部位于“src”目录中,并且标头位于“header”目录中,则可以使用

file(GLOB_RECURSE ${PROJECTNAME}_HEADERS ${CMAKE_SOURCE_DIR}/include/*.h)
file(GLOB_RECURSE ${PROJECTNAME}_SOURCES ${CMAKE_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE ${PROJECTNAME}_SOURCES ${CMAKE_SOURCE_DIR}/src/*.c)

这应该可以解决问题,因为它不会尝试在构建目录中递归。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 CMake 中混合 C 和 C++,什么是 CMakeCCompilerId.c 以及如何丢弃它 的相关文章

  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • CMake 创建可执行文件时未定义的引用

    我是 CMake 新手 我正在尝试编译我的项目 该项目创建了一些静态库和一些可执行文件 下面是我拥有的文件结构的示例 PROJECT SRC 子项目 1该文件夹的 cpp 所有源文件 和CMakeLists txt 1 创建静态库 子项目
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 具有嵌套条件行为的奇怪工具栏

    我遇到了一个非常奇怪的问题 如果你有一个很深的链ViewBuilder和 if 语句以及工具栏 工具栏中的某些项目是重复的 这是一张图片来说明我的意思 注意 2 个 按我 按钮 重现 注意 我使用的是 macOS Monterey Beta
  • 我的网站上需要有图标吗?如何消除我在 apache 日志中看到的错误?

    我不断在我的 apache 日志中看到 favicon 警告 我该如何摆脱这些 我的网站必须有图标吗 favicon ico是浏览器黑暗时代的产物之一 cca 2000 虽然无法阻止浏览器请求 但创建名为 favicon ico 的 0 字
  • 使用 ng-if 作为 ng-repeat 内部的开关?

    我正在开发 Angular 应用程序 我尝试使用 ng if 并在里面切换NG 重复但没有成功 我有这样的数据 id 52fb84fac6b93c152d8b4569 post id 52fb84fac6b93c152d8b4567 use
  • 在核心 MVC 中是否有任何充分的理由不使用 ViewComponent 而不是 Partial View?

    我是 MVC 新手 决定从 net core 开始 所以我对 core 与旧版本的差异不太了解 我确实找到了下面的问题 它提供了一些见解 但并没有帮助我决定是否可以基本上忽略部分视图 为什么我们应该使用 MVC 6 功能视图组件而不是部分视
  • Silverlight 中的 FrameworkPropertyMetadataOptions

    Silverlight 5 中是否有与 FrameworkPropertyMetadataOptions 等效的工具 我希望能够从我的用户控件强制进行双向绑定 如下所示 public static readonly DependencyPr
  • 从一个列表创建两个随机列表

    我想获取一个包含大约 12 个对象的字符串列表 并将其拆分为两个字符串列表 但将其完全随机化 列表示例 List 1 EXAMPLE 1 EXAMPLE 2 EXAMPLE 3 EXAMPLE 4 EXAMPLE 5 EXAMPLE 6 E
  • 使用 C 语言的套接字编程,使用 select() 函数

    根据我得到的答案这个线程 https stackoverflow com q 3366808 我创建了这个 Server sock init from SFL see http legacy imatix com html sfl time
  • 以编程方式在支持 bean 中创建并添加复合组件

    我正在使用动态仪表板 用户可以根据需要固定和删除项目 现在我有一个问题 我想将现有的复合组件从支持 bean 添加到视图中 我试图从互联网上找到正确的方法来做到这一点 但到目前为止还没有成功 这是我要添加的简单复合组件
  • 在我的 React 应用程序中访问 heroku 配置变量

    我在我的 Heroku 应用程序中定义了一个配置变量 BASE URL 我试图在我的 React 应用程序中访问它 process env BASE URL 但当我 console log 它时 它给了我未定义的信息 因为它似乎不存在 如何
  • Android Studio 更新到 2.0 后冻结

    我刚刚将 Android Studio 从 1 4 更新到 2 0 启动时它在启动屏幕上冻结 是否可以修复它或者我必须重新下载它 这很奇怪 我的 MAC Ubuntu 和 Windows 10 也已更新到 2 0 到目前为止 我没有感觉到任
  • 在bash中,如何将返回值存储在变量中?

    我知道 Linux 中的一些非常基本的命令 并且正在尝试编写一些脚本 我编写了一个函数 用于计算 5 位数字中最后 2 位数字的总和 该函数应将所得总和连接在最后 2 位数字之间并返回它 我想返回这个值的原因是因为我将在另一个函数中使用这个
  • 了解二进制 xls 文件格式

    我试图在不使用任何 xls 库的情况下读取 xls 文件的内容 但这样做时遇到问题 我正在尝试使用我找到的信息here http msdn microsoft com en us library gg615597 aspx 它有一些关于如何
  • Gmail 未检测到回复字段

    我的设置中有以下设置反馈邮件程序 def notification feedback from email protected cdn cgi l email protection subject Some feedback recipie
  • HTML img 属性“完整”

    谁能解释一下属性的含义complete 我在某处读到这可能与 DOM 有关 img src folder pic jpeg 属性complete规范中没有定义的含义 并且它可能没有任何效果 尽管可以使用getAttribute 方法 所以问
  • 我需要从 serviceworker 中访问本地存储或 cookie

    我希望在推送事件之后进行 fetch 调用 通过内部 api 获取 notif 数据 其中包含用户特定的参数 这些参数存储在本地存储或 cookie 中 例如用户类型或国家 地区 ID 我该怎么做 您无法在 Service Worker 中
  • 设置 mex 以使用 Visual Studio 2010 编译器

    我安装了 Visual Studio 2010 但是 MATLAB 找不到编译器 gt gt mex setup Please choose your compiler for building external interface MEX
  • 沿着 d3 中的路径拖动

    使用 d3 和 React 我绘制了一条路径 在这条路径上 我有多个圆圈 只能沿着该路径拖动 然而 我当前的实现仅 在某种程度上 在该路径上有一个圆圈时才有效 在 DragStart 上 无论位置如何 它都会在路径上移动到长度 0 并且每当
  • 仅显示 x 轴图的第一个和最后一个刻度标签

    我正在解析日志文件并创建一个绘图 我不需要 X 轴上的所有标签 我只想显示第一个和最后一个或其中的几个 并带有特定的步骤 假设每 100 个 我怎样才能做到这一点 我只能显示第一个或最后一个 但不能同时显示两者 My code import
  • PHP 的日期和时间助手(如 Java 中的 Joda-Time)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个类似的库 开源 乔达时间 http www joda org joda time 在Ja
  • 在 CMake 中混合 C 和 C++,什么是 CMakeCCompilerId.c 以及如何丢弃它

    我有一个混合 C 和 C 的简单项目 将 C 库包装到 C 类中并使其易于在 C 项目中使用 该项目是使用 VisualStudio 构建的 我在 Linux 或 Mac 下 所以我想将其转换为 CMake 项目 VS项目内容满满的