在编译cmockery.c时,如何解决GCC“错误:从'SourceLocation *'转换为'int'会丢失精度”错误?

时间:2011-01-03 17:41:59

标签: gcc casting compilation cmockery

我需要使用Cmockery将单元测试添加到使用手工制作的Makefile的现有构建环境中。所以我需要弄清楚如何构建cmockery.c(没有automake)。

当我跑步时:

g++ -DHAVE_CONFIG_H -DPIC -I ../cmockery-0.1.2 -I /usr/include/malloc -c ../cmockery-0.1.2/cmockery.c -o obj/cmockery.o

我得到一长串错误,如下所示:

../cmockery-0.1.2/cmockery.c: In function ‘void initialize_source_location(SourceLocation*)’:
../cmockery-0.1.2/cmockery.c:248: error: cast from ‘SourceLocation*’ to ‘int’ loses precision

以下是cmockery.c的第247:248行:

static void initialize_source_location(SourceLocation * const location) {
    assert_true(location);

assert_true在cmockery.h的第154行定义:

#define assert_true(c) _assert_true((int)(c), #c, __FILE__, __LINE__)

所以问题(如错误状态)是GCC不喜欢从'SourceLocation *'到'int'的演员。

我可以使用./configuremake构建Cmockery(在Linux上,如果我export CFLAGS=-I/usr/include/malloc,则on Mac OS X),而不会出现任何错误。当我运行make./configure之后)时,我已经尝试查看编译cmockery.c的命令行:

 gcc -DHAVE_CONFIG_H -I. -I. -I./src -I./src -Isrc/google -I/usr/include/malloc -MT libcmockery_la-cmockery.lo -MD -MP -MF .deps/libcmockery_la-cmockery.Tpo -c src/cmockery.c  -fno-common -DPIC -o .libs/libcmockery_la-cmockery.o

...但我没有看到任何可能解决此错误的选项。

在“error: cast from 'void*' to 'int' loses precision”中,我看到我可以将cmockery.h中的(int)更改为(intptr_t)。而且我已经证实有效。但由于我可以使用./configuremake构建Cmockery,因此必须有一种方法可以在不修改源的情况下构建它。

1 个答案:

答案 0 :(得分:2)

在我的系统上使用gcc代替g++会将该错误转换为我系统上的警告(Mandriva Linux 2010.1 64位)并允许编译完成:

.
.
.
../cmockery-0.1.2/cmockery.c:248: warning: cast from pointer to integer of different size
.
.
.

然而,我觉得有必要指出,当我在一个相对常见的平台上看到一大堆警告时,我一般都很谨慎(Linux 64位/ GCC,我会推测其他人)。使用-m32选项强制编译为32位目标文件不会产生任何警告,因此可以假设原样使用的源代码可能不是64位干净。无论您是否使用自动工具,都会发生这种情况。

我不知道有问题的项目,所以它可能很好,但无论如何要谨慎使用......

编辑:

根据this回答关于cmockery邮件列表的OP问题,目前当前版本不是64位清理。似乎错误/警告是有充分理由的......