title: Clang and undefined symbols when building a library
body: <p>I'm working on a C++ framework, and there's a few issues when I compile it on OSX with Clang.</p>
  
  <p>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.</p>
  
  <p>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.</p>
  
  <p>How come ? What should I do ?</p>
  
  <p>Here's my CMakeLists.txt in case that can be useful:</p>
  
  <pre><code>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})
  </code></pre>
  
  <p>This is the command that crashes:</p>
  
  <pre><code>/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 [...]
  </code></pre>
  
  <p>And here are the two kinds of error I get:</p>
  
  <p>Undefined symbols for architecture x86_64:</p>
  
  <pre><code>  "_BIO_ctrl", referenced from:
        Cipher::encode_base64(unsigned char*, unsigned int) const in cipher.cpp.o
  </code></pre>
  
  <p>And the second one:</p>
  
  <pre><code>  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
  </code></pre>