ClickHouse / clickhouse-odbc

ODBC driver for ClickHouse
https://clickhouse.tech
Apache License 2.0
245 stars 86 forks source link

Build fail on macOS 11.4, Undefined symbols for architecture x86_64 #359

Open lngvietthang opened 3 years ago

lngvietthang commented 3 years ago

I have this error when I built in my MacBook (macOS Big Sur 11.4)

I install all requirement brew install poco openssl icu4c unixodbc And step cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=OFF -DOPENSSL_ROOT_DIR=$(brew --prefix)/opt/openssl -DICU_ROOT=$(brew --prefix)/opt/icu4c .. does not get any error

[ 98%] Linking CXX static library libclickhouse-odbcw-impl.a
[ 98%] Built target clickhouse-odbcw-impl
[ 98%] Building CXX object driver/CMakeFiles/clickhouse-odbcw.dir/api/odbc.cpp.o
[ 98%] Linking CXX shared library libclickhouseodbcw.dylib
undef: _ucnv_open_58
undef: _ucnv_detectUnicodeSignature_58
undef: _ucnv_compareNames_58
undef: _ucnv_fromUnicode_58
undef: _ucnv_convertEx_58
undef: _ucnv_resetFromUnicode_58
undef: _ucnv_getMinCharSize_58
undef: _ucnv_close_58
undef: _ucnv_toUnicode_58
undef: _u_errorName_58
undef: _ucnv_resetToUnicode_58
Undefined symbols for architecture x86_64:
  "_ucnv_open_58", referenced from:
      UnicodeConverter::UnicodeConverter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
  "_ucnv_detectUnicodeSignature_58", referenced from:
      UnicodeConverter::UnicodeConverter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
  "_ucnv_compareNames_58", referenced from:
      sameEncoding(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
      UnicodeConverter::UnicodeConverter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
      UnicodeConversionContext::UnicodeConversionContext(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
  "_ucnv_fromUnicode_58", referenced from:
      void UnicodeConverter::convertFromPivot<char, unsigned short>(std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      UnicodeConverter::UnicodeConverter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
  "_ucnv_convertEx_58", referenced from:
      void convertEncoding<char, unsigned short, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void convertEncoding<unsigned short, char, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      short fillOutputString<unsigned char, long, long, UnicodeConversionContext&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void*, long, long*, bool, bool, bool, UnicodeConversionContext&) in lto.o
      void value_manip::from_application<unsigned char*>::to_driver<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::convert<UnicodeConversionContext&>(std::__1::basic_string_view<unsigned char, std::__1::char_traits<unsigned char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, UnicodeConversionContext&) in lto.o
  "_ucnv_resetFromUnicode_58", referenced from:
      void convertEncoding<char, unsigned short, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void UnicodeConverter::convertFromPivot<char, unsigned short>(std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      void convertEncoding<unsigned short, char, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      short fillOutputString<unsigned char, long, long, UnicodeConversionContext&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void*, long, long*, bool, bool, bool, UnicodeConversionContext&) in lto.o
      void value_manip::from_application<unsigned char*>::to_driver<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::convert<UnicodeConversionContext&>(std::__1::basic_string_view<unsigned char, std::__1::char_traits<unsigned char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, UnicodeConversionContext&) in lto.o
  "_ucnv_getMinCharSize_58", referenced from:
      void UnicodeConverter::convertToPivot<char, unsigned short>(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void convertEncoding<char, unsigned short, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void UnicodeConverter::convertFromPivot<char, unsigned short>(std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      void convertEncoding<unsigned short, char, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      UnicodeConverter::UnicodeConverter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
      UnicodeConversionContext::UnicodeConversionContext(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
      short fillOutputString<unsigned char, long, long, UnicodeConversionContext&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void*, long, long*, bool, bool, bool, UnicodeConversionContext&) in lto.o
      ...
  "_ucnv_close_58", referenced from:
      UnicodeConverter::~UnicodeConverter() in lto.o
  "_ucnv_toUnicode_58", referenced from:
      void UnicodeConverter::convertToPivot<char, unsigned short>(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
  "_u_errorName_58", referenced from:
      void UnicodeConverter::convertToPivot<char, unsigned short>(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void convertEncoding<char, unsigned short, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void UnicodeConverter::convertFromPivot<char, unsigned short>(std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      void convertEncoding<unsigned short, char, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      UnicodeConverter::UnicodeConverter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in lto.o
      short fillOutputString<unsigned char, long, long, UnicodeConversionContext&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void*, long, long*, bool, bool, bool, UnicodeConversionContext&) in lto.o
      void value_manip::from_application<unsigned char*>::to_driver<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::convert<UnicodeConversionContext&>(std::__1::basic_string_view<unsigned char, std::__1::char_traits<unsigned char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, UnicodeConversionContext&) in lto.o
      ...
  "_ucnv_resetToUnicode_58", referenced from:
      void UnicodeConverter::convertToPivot<char, unsigned short>(std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void convertEncoding<char, unsigned short, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, bool, bool) in lto.o
      void convertEncoding<unsigned short, char, unsigned short>(UnicodeConverter&, std::__1::basic_string_view<unsigned short, std::__1::char_traits<unsigned short> > const&, std::__1::basic_string<unsigned short, std::__1::char_traits<unsigned short>, std::__1::allocator<unsigned short> >&, UnicodeConverter&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, bool, bool) in lto.o
      short fillOutputString<unsigned char, long, long, UnicodeConversionContext&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void*, long, long*, bool, bool, bool, UnicodeConversionContext&) in lto.o
      void value_manip::from_application<unsigned char*>::to_driver<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::convert<UnicodeConversionContext&>(std::__1::basic_string_view<unsigned char, std::__1::char_traits<unsigned char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, UnicodeConversionContext&) in lto.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
gmake[2]: *** [driver/CMakeFiles/clickhouse-odbcw.dir/build.make:108: driver/libclickhouseodbcw.dylib] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:1225: driver/CMakeFiles/clickhouse-odbcw.dir/all] Error 2
gmake: *** [Makefile:156: all] Error 2
lngvietthang commented 3 years ago

Update: When I use libiodbc instead of unixodbc, the error disappear.

traceon commented 3 years ago

I tried the following with each of these: unixodbc and libiodbc.

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=OFF -DOPENSSL_ROOT_DIR=$(brew --prefix)/opt/openssl -DICU_ROOT=$(brew --prefix)/opt/icu4c ..
cmake --build . --parallel

In both scenarios driver was successfully built.

My environment: macOS Big Sur 11.4 Xcode 12.5

Try following these steps carefully:

  1. Install/update Xcode from App Store.
  2. Open it at least once to accept the end-user license agreement and automatically install the required components.
  3. Make sure that the latest Command Line Tools are installed and selected in the system:
    sudo rm -rf /Library/Developer/CommandLineTools
    sudo xcode-select --install
  4. Update brew and install dependencies (you probably need iODBC version of the driver in macOS):
    brew update
    brew upgrade
    brew doctor # ...address any issues reported by this.
    brew install git cmake make poco openssl icu4c libiodbc
  5. Clone the repo recursively and build afresh:

    rm -rf clickhouse-odbc
    git clone --recursive https://github.com/ClickHouse/clickhouse-odbc.git
    
    cd clickhouse-odbc
    mkdir build
    cd build
    
    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOPENSSL_ROOT_DIR=$(brew --prefix)/opt/openssl -DICU_ROOT=$(brew --prefix)/opt/icu4c ..
    cmake --build . --config RelWithDebInfo
    cmake --build . --config RelWithDebInfo --target package