created keil不能编译了 not 提示Target (create的中文翻译)

本文目录导航:

keil不能编译了,提示Target not created

作为一名资深的单片机工程师,我遇到了一个常见的编译问题:“Target not created”。

这一错误提示通常意味着程序中存在语句或语法上的错误。

要解决这个问题,最好的方法是首先确定错误的具体位置,这样才能针对性地进行修改。

如果在其他版本的软件上没有遇到同样的错误,而是在新安装的软件上出现了这个问题,那么可能的原因是头文件丢失或损坏。

头文件与系统安装紧密相关,因此需要特别注意。

如果你对单片机C语言编程感兴趣并想要进一步学习,可以在网络上搜索“17个实验学会单片机”,找到相关的教程。

这个教程包含了丰富的实验内容,能够帮助你系统地掌握单片机C语言编程的知识。

在进行编程时,遇到“Target not created”这样的错误提示,可以尝试从以下几个方面排查问题。

首先,检查程序中的语法是否有误,例如是否有拼写错误、遗漏的分号等。

其次,查看是否有未定义的变量或函数,这可能是导致编译错误的原因之一。

此外,确保所有使用的库文件都已正确包含。

有时,头文件路径设置不当也会导致“Target not created”的错误提示。

因此,检查项目的设置,确保所有必要的头文件路径都被正确配置。

如果以上方法都无法解决问题,可以尝试将程序分解成更小的部分进行编译。

这样可以更容易地定位到出错的具体位置。

同时,也可以考虑更新开发环境,确保使用的软件版本是最新的。

总之,“Target not created”是一个常见的编译错误提示,但通过细致的排查和适当的调整,通常可以找到并解决这个问题。

希望以上建议对你有所帮助。

created keil不能编译了 not 提示Target (create的中文翻译)

记一次 C++20 包含 thread 头文件编译报错问题排查

之前项目使用的是固定的 C++11 标准,即 中的 CMAKE_CXX_STANDARD 被设置为 11。

由于 Homebrew 的 GTest 最新版本要求最低 C++14,因此取消了 CMAKE_CXX_STANDARD 的锁定。

最近客户提交了一个 ticket,表示使用 C++20 编译时出现错误。

我接手后修复了一个小问题,但随后发现另一个编译错误让人困惑。

省略了之前的错误内容,错误信息显示是包含头文件后导致的。

问题排查:首先,我尝试了无脑但实用的排除法,将问题源文件的代码反复删减,例如删除其他头文件,最终发现,仅剩一行 #include 代码时仍然报错。

为了验证是否为 GCC 的 bug,我手动创建了一个文件,仅包含一行代码,然后使用 g++ -std=c++20 -c 编译,没有问题。

由此可见,通过代码排除的方式无法解决问题,很可能是编译命令的问题。

因此,我使用了 make VERBOSE=1 命令获取详细的编译命令,最终简化为:其中 /app 为项目目录,lib/ 为 CMake 子项目目录。

然后我突然就明白了……项目里为了实现信号量而单独编写了一个 Semaphore 类,位于 Semaphore.h。

C++ 头文件并不区分大小写,因此在搜索头文件时,优先找到了 /app/lib/Semaphore.h 而非系统自带的包含 POSIX 信号量头文件的 semaphore.h。

GCC 11 中头文件隐式包含了头文件。

加上 -v 选项编译可以更清晰地看到搜索顺序:当然,这个问题与操作系统有关,macOS 上的 Clang 无法复现,但在 Ubuntu 22.04 中可以使用以下命令复现。

解决方法:虽然考虑过将 Semaphore.h 重命名,但考虑到项目本身就比较混乱,例如在 tests/ 目录下,包含 lib/ 目录的头文件风格有几种:因为项目是多人合作的,我也在负责其他项目,无法保证所有 PR review 都到位,加上历史因素,所以上述问题仍然存在。

于是趁这个机会,将 lib/ 路径从 tests/ 目录的 target_include_directories 中移除了,这样代码也变得更统一了。

P.S. 之前考虑过引入 clang-tidy 到 CI,但一方面默认配置下扫一遍项目耗时太久,另一方面有太多代码风格要修改。

这也不是公司 OKR 花大力度的项目,所以也不想投入过多时间修这个了。

被我忽悠了吗?其实看到这里,如果觉得我写得没有什么问题,那么恭喜你,被我忽悠了。

首先,从前面我复现的那段代码可以看到,我是在 Docker 容器中复现的。

如果你在容器中测试过复现代码,会发现并没有问题:之前复现我创建的是小写的 semaphore.h 报错,这没问题。

但我这里创建了大写的 Semaphore.h 编译仍然通过了。

然而,我进入项目目录中,运行同样的命令时仍然报错:问题的根源在于,Ubuntu 22.04 容器内,文件名是大小写敏感的,因此可以同时存在 semaphore.h 和 Semaphore.h。

然而,我运行容器时,是将 /app 目录映射到了宿主机的项目目录,因此 /app 目录下并不是像 Linux 一样对文件名大小写敏感。

(即便如此,我仍然将 lib/ 目录从 target_include_directories 中移除了,借机把头文件包含的代码风格整理下也是好的)

C++两个头文件互相包含对方,编译无法通过怎么办

这是因为头文件只能包含一次,可以用宏定义来解决这个问题。在你的Line和Point两个.h文件中分别加入下面的代码:

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

85阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

85阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

77阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读