【问题标题】:GCC compiles program on Mac OS X but not on Ubuntu with clangGCC 在 Mac OS X 上编译程序,但在带有 clang 的 Ubuntu 上不编译
【发布时间】:2015-12-16 20:06:57
【问题描述】:

我曾尝试在学校的 mac OS X 上编译一个带有“-Wall -Wextra -Werror”标志的文件,它运行良好,但是当我回家并在 ubuntu 上尝试同样的事情时,它给了我这个错误:

tests/00_part1_ft_memset.spec.c: In function ‘unittest1’:
tests/00_part1_ft_memset.spec.c:9:12: error: ‘memset’ used with constant zero length parameter; this could be due to transposed parameters [-Werror=memset-transposed-args]
  mt_assert(memset(b1, 99, 0) == ft_memset(b1, 99, 0));

为什么它在 2 个不同的操作系统上工作方式不同,是否可以让我的 ubuntu 像 OS X 一样反应?有这个的配置文件吗?

【问题讨论】:

  • 在您的问题中显示您的tests/00_part1_ft_memset.spec.c 文件
  • @BasileStarynkevitch 看起来相关部分已经显示:memset(b1, 99, 0) 是导致错误的原因。
  • 并阅读memset(3)的文档
  • 是的,这是产生此错误的部分,但此代码是一个单元测试,它在 mac osx 上运行良好:/您可以在此处找到该文件 -> github.com/yyang42/moulitest/blob/master/libft_tests/tests/…
  • @Nestoyeur 它可能也适用于 Ubuntu。代码没问题。不同的是编译器的挑剔性。你要求编译器非常挑剔,只要一点点 lint 就会出错。现在你有了。什么让你感到惊讶?不同的编译器会发出不同的警告吗?业内任何人都不会感到惊讶。

标签: linux macos gcc compilation clang


【解决方案1】:

我敢打赌,你的意思不是真的?

memset(b1, 99, 0);

这意味着您想将接下来的 0 个字节设置为 (unsigned char)99 没有任何价值……

你可能的意思是:

memset(b1, 0, 99); // to set the next 99 bytes to the value 0

【讨论】:

  • 由于它返回第一个参数,断言似乎有点奇怪
  • 如果您针对标准 C 版本对自己的 memset 版本(称为 ft_memset)的实现进行单元测试,这并不奇怪。
  • 是的,这是我自己为学校项目实施的 memset(和其他功能)的单元测试。
【解决方案2】:

为什么它在两个不同的操作系统上的工作方式不同?

因为他们使用不同的编译器。

Clang 不是 gcc。虽然 clang 旨在与 gcc 选项兼容,但它也实现了自己的一组警告。

你得到你想要的:-Wall -Wextra -Werror 启用大量警告并且使它们致命。 您最好的选择可能是选择性地禁用 memset-transposed-args 警告。或者修复/调整代码。

错误消息准确地指出了问题,0 作为memset 的第三个参数。

【讨论】:

  • 我在 mac osx 上使用完全相同的方式进行编译,但不会出现此错误。我会尽量照你说的做,并禁用一些警告。
  • @Nestoyeur 你应该明白编译器可以警告任何事情。如果您故意发出警告致命错误,那么为什么其他编译器会因其他编译器接受的东西而窒息而感到惊讶呢?您希望 Microsoft 编译器接受相同的选项吗?
【解决方案3】:

好的,正如 Jens 所说,您处理的不是同一个编译器,因此功能可能会有所不同。

因此,作为二重奏,我理​​解你想要达到的目标。

尝试添加

#pragma GCC diagnostic ignored "-Wmemset-transposed-args"

在您的测试主程序顶部,它应该禁用所有具有此显式名称的警告,并且仍然使用 -Wall -Wextra -Werror 进行编译。

【讨论】:

  • Hey duoquadra \o ;) 在我的电脑上让它工作后,我才意识到即使它工作了,它也会比以前更奇怪!
  • 首先 Makefile 在我的 ubuntu 和 OSX 上都使用了 GCC 命令,但没有相同的结果。现在我已经编辑了 Makefile 以使用 clang 而不是 GCC,然后它的工作方式与 OSX 相同,但这绝对不是相同的编译器。
  • 确实很奇怪。无论哪种方式,如果您想要在学校获得相同的结果,我建议您使用虚拟机。
  • 也许他们在学校使用别名来强制 clang,就像他的 -> gcc () { clang $* } 无论如何我只是将这个添加到我的 zshrc 中,明天我会处理其中一个真的用过。如果我不能确保我的笔记本电脑上的结果与学校计算机上的结果相同,我将安装 OSX,因为我不喜欢 VM 方式
猜你喜欢
  • 2015-05-17
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2012-01-13
  • 2011-11-11
相关资源
最近更新 更多