I'm working on a C++ framework, and there's a few issues when I compile it on OSX with Clang.
First of, I'm using some other libraries, such as openssl, and clang complains that some symbols aren't solved when I build the library. They shouldn't be: these libraries will be linked with the final binary, it shouldn't happen on an intermediary.
Then, there's also a few methods and variables that are supposed to be implemented in the "client" binary... with GCC, no problems, but Clang also complains that these symbols can't be solved during compilation.
How come ? What should I do ?
Here's my CMakeLists.txt in case that can be useful:
cmake_minimum_required(VERSION 2.8)
project(crails_project)
set(CMAKE_CXX_FLAGS "-std=c++0x -Wall -Wno-deprecated-declarations -pedantic -DASYNC_SERVER -DSERVER_DEBUG -DUSE_MONGODB_SESSION_STORE")
find_package(cppnetlib REQUIRED)
include_directories(include /usr/local/include ${CPPNETLIB_INCLUDE_DIRS} .)
file(GLOB crails_core
src/*.cpp)
file(GLOB crails_sql
src/sql/*.cpp)
file(GLOB crails_mongodb
src/mongodb/*.cpp)
add_library(crails-core SHARED ${crails_core})
add_library(crails-sql SHARED ${crails_sql})
add_library(crails-mongodb SHARED ${crails_mongodb})
This is the command that crashes:
/usr/bin/c++ -std=c++0x -Wall -Wno-deprecated-declarations -pedantic -DASYNC_SERVER -DSERVER_DEBUG -DUSE_MONGODB_SESSION_STORE -dynamiclib -Wl,-headerpad_max_install_names -o libcrails-core.dylib -install_name /Users/michael/Personal/crails/build/libcrails-core.dylib CMakeFiles/crails-core.dir/src/assets.cpp.o CMakeFiles/crails-core.dir/src/cgi2params.cpp.o CMakeFiles/crails-core.dir/src/cipher.cpp.o [...]
And here are the two kinds of error I get:
Undefined symbols for architecture x86_64:
"_BIO_ctrl", referenced from:
Cipher::encode_base64(unsigned char*, unsigned int) const in cipher.cpp.o
And the second one:
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for boost::detail::thread_data_base", referenced from:
boost::detail::thread_data_base::thread_data_base() in server.cpp.o
You need to pass the values to the function Calculate. Variables x, y, z and function are not accessible outside the class and also u need a return type to the function so that you can get the output from the function Calculate.
If you are linking with a static library, you can have some unresolved symbols in the static library, as long as you don't reference the unresolved symbols.
After all input files have been read and all symbol resolution is complete, the link-editor searches the internal symbol table for any symbol references that have not been bound to symbol definitions. These symbol references are referred to as undefined symbols.
for clang , compiles code as C. for clang++ , compiles code as C++
I don't recommend to enable global dynamic lookup:
-undefined dynamic_lookup
which will mark all undefined symbols as having to be looked up at runtime.
Much more safe way to resolve it for specific symbols:
-Wl,-U,symbol_name
, which only does so for the given symbol (note: you have to prepend an underscore to the symbol name)
You could also use weak dynamic linking:
extern int SayHello() __attribute__((weak));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With