1

我有一个有点奇怪的问题。我们有一个项目,我们为几种不同的架构编译,特别是这 2 个:SH4 和 MIPS。

一段时间以来,我们遇到了一个问题,其中一些代码可以在 SH4 中编译,但不能用于 MIPS,因为缺少包含。我已将问题缩小到此测试文件:

#include <sstream>
// deliberately not including the needed includes

int main()
{
  const char *toto = "Hello World";
  // using printf and strlen which require <stdio.h> and <string.h>
  printf("Toto has len %d\n", strlen(toto)); 
  return 0;
}

使用此命令编译为 SH4

$ sh4-linux-g++ -O0 -g -Wall -Werror -Wno-write-strings \
                -fno-rtti -fno-exceptions test.cpp -o test
$ 

-> 完全没有问题。该文件实际上正常执行。


而使用 MIPS

$ mips-linux-gnu-g++ -O0 -g -Wall -Werror -Wno-write-strings \
                     -fno-rtti -fno-exceptions test.cpp -o test 
test.cpp: In function 'int main()':
test.cpp:6: error: 'strlen' was not declared in this scope
$ 

现在,我已经运行了几件事,特别是 g++ 的依赖生成。我看到的是这样的:

SH4 

$ sh4-linux-g++ -O0 -g -Wall -Werror -Wno-write-strings \ 
                -fno-rtti -fno-exceptions test.cpp -M |grep "/string.h"

  /opt/STM/STLinux-2.3/devkit/sh4/target/usr/include/string.h \

-> string.h 自动包含在内。

MIPS

mips-linux-gnu-g++ -O0 -g -Wall -Werror -Wno-write-strings \
 -fno-rtti -fno-exceptions test.cpp -M |grep "/string.h"

-> 包含中缺少的 string.h

有关信息:

SH4 version  = 4.2.4 (2007)  
MIPS version = 4.3.2 (2008)

这里发生了什么?在 SH4 上编译时,<sstream>include 似乎拖住了 strlen() 所需的所有内容,而在 MIPS 上却没有。我怀疑这是因为版本不同,但我不确定。

最后,我真正的问题是,当我在 SH4 上开发时,我想确定如果它编译,它将在所有目标上编译。有针对这个的解决方法吗?

4

1 回答 1

2

这里发生了什么?

你基本上是在问“为什么我的非标准代码用一个版本的编译器编译而不是另一个?” 当然是因为版本不同。

请参阅运行时库 (libstdc++)部分下的GCC 4.3 更改:

标头依赖项已得到简化,减少了不必要的包含和预处理膨胀。

我们也在最近的版本中继续减少标头依赖项,以更严格并减少命名空间污染(例如4.6避免不必要地包含<cstddef>4.7不再包含<unistd.h>不必要的),所以为了回答你的最后一个问题,我建议使用最新的 GCC您可以使用版本(即使只是检查代码而不是生产版本),因为它具有最严格、最干净的标头,并且会发现最多的问题。另一种选择是使用更严格的标准库实现,例如libcomo

于 2012-07-19T11:16:36.127 回答