我遇到了一个有点奇怪的问题。 我们有一个项目,我们为几种不同的架构编译,特别是这两个: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-linux-g++ -O0 -g -Wall -Werror -Wno-write-strings \
-fno-rtti -fno-exceptions test.cpp -o test
$
- &GT;完全没问题。该文件实际上正常执行。
$ 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-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 \
- &GT; string.h自动包含。
mips-linux-gnu-g++ -O0 -g -Wall -Werror -Wno-write-strings \
-fno-rtti -fno-exceptions test.cpp -M |grep "/string.h"
- &GT;包含
中缺少string.h有关信息:
SH4 version = 4.2.4 (2007)
MIPS version = 4.3.2 (2008)
这里发生了什么? <sstream>
include似乎拖拽了在编译SH4时strlen()所需的所有内容,而在MIPS上却没有。我怀疑这是因为版本不同,但我不确定。
我最后的问题是,当我在SH4上开发时,我想确定如果它编译,它将在所有目标上编译。 有解决方案吗?
答案 0 :(得分:2)
这里发生了什么?
你基本上问“为什么我的非标准代码用一个版本的编译器编译而不是另一个版本?”当然这是因为版本不同。
请参阅运行时库(libstdc ++)部分下的GCC 4.3 changes:
简化了标头依赖性,减少了不必要的包含和预处理膨胀。
我们在更新的版本中也继续减少标头依赖性,更严格并减少名称空间污染(例如4.6避免不必要地包括<cstddef>
,4.7不再包括libcomo {1}}不必要地),所以为了回答你的最后一个问题,我建议你使用最新的GCC版本(即使只检查代码不是生产版本),因为它有最严格,最干净的标题,并且会找到最多的问题。另一种选择是使用更严格的标准库实现,例如{{3}}。