Как мне обойти GCC "ошибка: приведение от" SourceLocation* "к" int "теряет точность" при компиляции cmockery.c?
Мне нужно добавить модульные тесты, используя 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
Вот строки 247:248 из cmockery.c:
static void initialize_source_location(SourceLocation * const location) {
assert_true(location);
assert_true
определяется в строке 154 файла cmockery.h:
#define assert_true(c) _assert_true((int)(c), #c, __FILE__, __LINE__)
Таким образом, проблема (как говорится в сообщении об ошибке) состоит в том, что GCC не нравится приведение от 'SourceLocation*' к 'int'.
Я могу построить Cmockery, используя ./configure
а также 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)
, И я подтвердил, что работает. Но так как я могу построить Cmockery с ./configure
а также make
, должен быть способ получить его для сборки без изменения источника.
1 ответ
С помощью gcc
вместо g++
в моей системе эта ошибка превращается в предупреждение в моей системе (Mandriva Linux 2010.1 64-bit) и позволяет завершить компиляцию:
.
.
.
../cmockery-0.1.2/cmockery.c:248: warning: cast from pointer to integer of different size
.
.
.
Однако я чувствую необходимость указать, что я, как правило, настороженно отношусь к целому ряду предупреждений о том, что является относительно распространенной платформой (Linux 64-bit/GCC и я бы предположил другие). С использованием -m32
Опция принудительной компиляции в 32-битный объектный файл не выдает никаких предупреждений, поэтому можно предположить, что исходный код, используемый как есть, может быть не 64-битным. Это происходит независимо от того, используете вы автоинструмент или нет.
Я не знаю, о каком проекте идет речь, поэтому он вполне может быть в порядке, но в любом случае используйте его с осторожностью...
РЕДАКТИРОВАТЬ:
Согласно этому ответу на вопрос OP к списку рассылки cmockery, текущая версия не является 64-битной чистой в настоящее время. Кажется, что ошибки / предупреждения были там по уважительной причине...