Red
Red

Reputation: 2246

Why does clang create a linking problem when the symbols are present?

I have a strange linking problem. I have a bunch files that I am trying to compile, but I am running into an undefined symbol error. Below is the error:

clang U_outsup.o U_OUTSUR.o
Undefined symbols for architecture x86_64:
  "U_outsup(surface*, __sFILE*)", referenced from:
      U_outsur(surface*, char*) in U_OUTSUR.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

The same happens when I compile trying to with the source files to an out executable. If I look at those object files (clang -c U_outsup.c U_OUTSUR.C), I see the following:

U_outsup.o:     file format Mach-O 64-bit x86-64

SYMBOL TABLE:
0000000000000420 l       __DATA,__data  _rname
0000000000000000 g     F __TEXT,__text  _U_outsup
0000000000000000         *UND*  _A_extcpc
0000000000000000         *UND*  _E_seterr
0000000000000000         *UND*  _U_issurr
0000000000000000         *UND*  _U_surbre
0000000000000000         *UND*  _fprintf

U_OUTSUR.o:     file format Mach-O 64-bit x86-64

SYMBOL TABLE:
0000000000000090 l       __DATA,__data  __ZL5rname
0000000000000000 g     F __TEXT,__text  __Z8U_outsurP7surfacePc
0000000000000000         *UND*  __Z8E_seterrlPc
0000000000000000         *UND*  __Z8U_outsupP7surfaceP7__sFILE
0000000000000000         *UND*  _fclose
0000000000000000         *UND*  _fopen

So, I am assuming the symbol "U_outsup(surface*, __sFILE*)" can't be found because it has a ridiculous name in the symbol table. Can anyone help me figure out what is going on here? Thanks again.

Upvotes: 0

Views: 663

Answers (1)

Matthieu Brucher
Matthieu Brucher

Reputation: 22033

It doesn't have a ridiculous name. It has a c++ mangled name.

That means it was built with a c++ compiler and not a c one. Recompile the library with gcc or clang, not g++ or clang++.

Upvotes: 3

Related Questions