2010-09-18 2 views
1

Я получаю ошибку undefined symbol, хотя я думаю, что я определил ее в порядке. Из чтения других сообщений и Googling кажется, что компоновщик не находит соответствующий символ. Я новичок в C, поэтому я уверен, что мне просто не хватает чего-то глупого.Неопределенный символ

glen-urbans-macbook-pro:everybit glurban$ make 
gcc -O3 -DNDEBUG -std=c99 -Wall -Wstrict-prototypes -I. -m64 -DBUILD_64 -c bitarray.c -o bitarray.o 
gcc -o everybit main.o ktiming.o bitarray.o tests.o -arch x86_64 -framework CoreServices 
gcc -o everybit_harvey main.o ktiming.o bitarray_harvey.o tests.o -arch x86_64 -framework CoreServices 
Undefined symbols: 
    "_bitarray_reverse", referenced from: 
     _test_reverse in tests.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [everybit_harvey] Error 1 

В tests.c:

#include "bitarray.h" 
... 

/* Peform a reversal operation on test_ba. */ 
static void testutil_reverse(size_t bit_off, size_t bit_len) { 
    assert(test_ba != NULL); 
    bitarray_reverse(test_ba, bit_off, bit_len); 
    if (test_verbose) { 
    bitarray_fprint(stdout, test_ba); 
    fprintf(stdout, " rotate off=%llu, len=%llu\n", 
     (unsigned long long) bit_off, (unsigned long long) bit_len); 
    } 
} 

static void test_reverse(void) { 
    testutil_frmstr("10000101"); 
    testutil_reverse(0, 8); 
    testutil_expect("10100001", 4); 
} 

test_case_t test_cases[] = { 
    test_headerexamples, 
    test_8bit, 
    test_moreflips, 
    // ADD YOUR TEST CASES HERE 
    test_reverse, 
    NULL // This marks the end of all test cases. Don't change this! 
}; 

В bitarray.c,

/* Reverse a bit array */ 
void bitarray_reverse(bitarray_t *ba, size_t bit_off, size_t bit_len){ 
    size_t tmp; 
    int i; 
    for(i = 0; i < bit_len/2; i++){ 
     tmp = bitarray_get(ba, bit_off + i); 
     bitarray_set(ba, bit_off + i, bitarray_get(ba,bit_off + bit_len - 1 - i)); 
     bitarray_set(ba, bit_off + bit_len - 1 - i, tmp); 
    } 
} 

В bitarray.h:

void bitarray_reverse(bitarray_t *ba, size_t bit_off, size_t bit_len); 

ТВВ

+0

Вы показали исходный код для bitarray.c, но на самом деле используете bitarray_harvey.c. Который, вероятно, не содержит bitarray_reverse() –

ответ

1

bitarray.o скомпилирован в объектный файл everybitНО есть нет ссылки в этой линии everybit следовательно неопределенные символы ...

gcc -o everybit_harvey main.o ktiming.o bitarray_harvey.o tests.o -arch x86_64 -framework CoreServices 
Undefined symbols: 
    "_bitarray_reverse", referenced from: 
     _test_reverse in tests.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [everybit_harvey] Error 1 

Что _harvey речь?

+0

'_harvey' относится к исходной версии кода (он модифицируется в версии non harvey). Если я правильно понимаю, что происходит: может быть, test.o вызывает либо allbit, либо everybit_harvey, а не для второго, потому что bitarray_reverse там нет? – unsorted

+0

Может быть, unsorted необходимо для 'gcc -O3 -DNDEBUG -std = c99 -Wall -Wstrict-prototypes -I. -m64 -DBUILD_64 -c bitarray_harvey.c -o bitarray_harvey.o'. Как создается 'bitarray_harvey.o'? – pmg

Смежные вопросы