我需要使用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
和make
构建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)
。而且我已经证实有效。但由于我可以使用./configure
和make
构建Cmockery,因此必须有一种方法可以在不修改源的情况下构建它。
答案 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位清理。似乎错误/警告是有充分理由的......