clickhouse-odbc
clickhouse-odbc copied to clipboard
Build fail on macOS 11.4, Undefined symbols for architecture x86_64
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
Update:
When I use libiodbc instead of unixodbc, the error disappear.
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:
- Install/update Xcode from App Store.
- Open it at least once to accept the end-user license agreement and automatically install the required components.
- 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 - Update
brewand 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 - 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