tags:

views:

78

answers:

1
+1  Q: 

Undefined symbol

I'm getting an undefined symbol error even though I think I've defined it okay. From reading other posts and Googling, it seems that the linker is failing to find the appropriate symbol. I'm new to C so I'm sure I'm just missing something stupid.

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

In 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!
};

In 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);
    }
}

In bitarray.h:

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

TIA

+1  A: 

bitarray.o is compiled into an object file everybit BUT there is no reference in this line to everybit hence the undefined symbols...

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

What is _harveyreferring to?

tommieb75
`_harvey` refers to the original version of the code (it's getting modified in the non harvey version). If I understand correctly what's going on: maybe tests.o calls either everybit or everybit_harvey, and fails for the second one because bitarray_reverse is not in there?
unsorted
Maybe unsorted needs to `gcc -O3 -DNDEBUG -std=c99 -Wall -Wstrict-prototypes -I. -m64 -DBUILD_64 -c bitarray_harvey.c -o bitarray_harvey.o`. How is `bitarray_harvey.o` created?
pmg