Undefined symbols for architecture x86_64: ld: symbol(s) not found for architecture x86_64

If you are getting similar error in your code (while mixing C and C++ code)

Undefined symbols for architecture x86_64:
  "func()", referenced from:
      _main in cc_code-NhxeQf.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

or something like this, during linking phase

error: ‘your_symbol_goes_here’ was not declared in this scope

It might mean that you are trying to include C code in an inappropriate way.

Take a look at samples below

/* This is c_code.h */
void func();
/*This is c_code.c */
void func() {
	int a = 1;
}
/* This is cc_code.cc */
#include "c_code.h"

int main() {
	func();
	return 0;
}

Now, let’s try to compile it:

shell> cc -o cc_code cc_code.cc c_code.c
Undefined symbols for architecture x86_64:
  "func()", referenced from:
      _main in cc_code-seLpaq.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 solution here is to mark explicitly, that symbols included in cc_code.cc are coming from C

/* This is modified cc_code.cc, now it is called cc_code_modified.cc*/
extern "C" {
        #include "c_code.h"
}

int main() {
        func();
        return 0;
}

And now, there are no issues with compilation

shell> cc -o cc_code cc_code_modified.cc c_code.c

Make sure to check this page: http://www.parashift.com/c++-faq/index.html