0

我需要使用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'的转换。

./configure我可以使用and构建 Cmockery make(在 Linux上,如果我首先在 Mac OS X 上export CFLAGS=-I/usr/include/malloc),没有任何错误。我尝试查看运行时编译 cmockery.c 的命令行make(之后./configure):

 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

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

在“错误:从 'void*' 转换为 'int' 失去精度”中,我看到我可以将(int)cmockery.h 更改为(intptr_t). 我已经确认这是有效的。./configure但是由于我可以使用and构建 Cmockery make,因此必须有一种方法可以在不修改源代码的情况下构建它。

4

1 回答 1

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 位干净的。无论您是否使用自动工具,都会发生这种情况。

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

编辑:

根据对OP 对 cmockery 邮件列表的问题回答,目前的版本不是 64 位干净的。似乎错误/警告的存在是有充分理由的......

于 2011-01-03T18:21:03.583 回答