MacOS static libs depend on old-style gnu libstdc++Solved

I've downloaded and taken a crack at the Mac static library build of TA. It seems that you build your .a file against the gcc compiler. Apple is generally not adding modern C++ features to the gcc compiler, as they are now mostly using clang -- most of the primary developers for clang now work at Apple.

I would suggest either compiling and linking against the modern llvm libc++ implementation on Apple or linking with both gnu libstdc as well as llvm libc++ and releasing both static libs for TurboActivate. In general, no new code is being developed on gcc at Apple, and I would be surprised if anyone complained.

Enclosed are the beginning of the cavalcade of errors that occur when you attempt to link TurboActivate.a into an Apple project using clang.

jwb

---- snipUndefined symbols for architecture x86_64: "__gnu_cxx::__exchange_and_add(int volatile*, int)", referenced from: l1006 in libTurboActivate.a(error_code.o) l1007 in libTurboActivate.a(error_code.o) "std::string::find_last_not_of(char const*, unsigned long) const", referenced from: TrimStr(std::string const&) in libTurboActivate.a(Trial.o) "std::string::find_first_not_of(char const*, unsigned long) const", referenced from: TrimStr(std::string const&) in libTurboActivate.a(Trial.o) "std::string::find(char, unsigned long) const", referenced from: int boost::io::detail::upper_bound_from_fstring<std::string, std::ctype<char> >(std::string const&, std::string::value_type, std::ctype<char> const&, unsigned char) in libTurboActivate.a(Activation.o) boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::parse(std::string const&) in libTurboActivate.a(Activation.o) "std::string::substr(unsigned long, unsigned long) const", referenced from: Activation::IsKeyValid(char*, int) in libTurboActivate.a(Activation.PKey.o) Trial::IsOnlineTrialKeyValid(char const*) in libTurboActivate.a(Trial.o) TrimStr(std::string const&) in libTurboActivate.a(Trial.o) "std::string::compare(std::string const&) const", referenced from: __gnu_cxx::hashtable<std::pair<std::string const, FeatureValue>, std::string, __gnu_cxx::hash<std::string>, std::_Select1st<std::pair<std::string const, FeatureValue> >, std::equal_to<std::string>, std::allocator<FeatureValue> >::find(std::string const&) in libTurboActivate.a(TurboActivate.o) __gnu_cxx::hashtable<std::pair<std::string const, unsigned int>, std::string, __gnu_cxx::hash<std::string>, std::_Select1st<std::pair<std::string const, unsigned int> >, std::equal_to<std::string>, std::allocator<unsigned int> >::insert_unique_noresize(std::pair<std::string const, unsigned int> const&) in libTurboActivate.a(TurboActivate.o) __gnu_cxx::hashtable<std::pair<std::string const, unsigned int>, std::string, __gnu_cxx::hash<std::string>, std::_Select1st<std::pair<std::string const, unsigned int> >, std::equal_to<std::string>, std::allocator<unsigned int> >::find(std::string const&) in libTurboActivate.a(TurboActivate.o) __gnu_cxx::hashtable<std::pair<std::string const, FeatureValue>, std::string, __gnu_cxx::hash<std::string>, std::_Select1st<std::pair<std::string const, FeatureValue> >, std::equal_to<std::string>, std::allocator<FeatureValue> >::insert_unique_noresize(std::pair<std::string const, FeatureValue> const&) in libTurboActivate.a(Activation.o) CryptoPP::AuthenticatedDecryptionFilter::ChannelPut2(std::string const&, unsigned char const*, unsigned long, int, bool) in libTurboActivate.a(filters.o) CryptoPP::AuthenticatedDecryptionFilter::ChannelCreatePutSpace(std::string const&, unsigned long&) in libTurboActivate.a(filters.o) CryptoPP::AuthenticatedEncryptionFilter::ChannelPut2(std::string const&, unsigned char const*, unsigned long, int, bool) in libTurboActivate.a(filters.o) ... "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const", referenced from: Activation::GetActivationBlock(std::string&, int, bool, bool, char const*) in libTurboActivate.a(Activation.o) Activation::VerifyAppendGenuineBlock(std::string const&, char const*, char const*, bool, unsigned long long) in libTurboActivate.a(Activation.o) Activation::VerifySaveActivation(std::string const&, char const*, char const*, char const*, bool, unsigned long long) in libTurboActivate.a(Activation.o) Trial::GetTrackBlock(std::string&, int, bool, char const*, unsigned long long, unsigned long long) in libTurboActivate.a(Trial.o) Trial::VerifySaveVTrial(std::string const&, char const*, char const*, bool, unsigned long long) in libTurboActivate.a(Trial.o) TrialExtension::Write(std::ostream&, unsigned char) in libTurboActivate.a(TrialExtension.o) "std::basic_ios<char, std::char_traits<char> >::widen(char) const", referenced from: boost::io::detail::stream_format_state<char, std::char_traits<char> >::apply_on(std::basic_ios<char, std::char_traits<char> >&, std::locale*) const in libTurboActivate.a(Activation.o) void boost::io::detail::put<char, std::char_traits<char>, std::allocator<char>, boost::io::detail::put_holder<char, std::char_traits<char> > const&>(boost::io::detail::put_holder<char, std::char_traits<char> > const&, boost::io::detail::format_item<char, std::char_traits<char>, std::allocator<char> > const&, boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::string_type&, boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::internal_streambuf_t&, std::locale*) in libTurboActivate.a(Activation.o) "std::istream::get()", referenced from: Activation::ReadToFlagInCombinedAblock(std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&, unsigned char, unsigned char, bool) in libTurboActivate.a(Activation.o) Activation::GetExtraData(int&) in libTurboActivate.a(Activation.o) Activation::WasOfflineActivation() in libTurboActivate.a(Activation.o) Activation::IsActivated(int&, bool&) in libTurboActivate.a(Activation.o) Activation::GetFeatureMap(__gnu_cxx::hash_map<std::string, FeatureValue, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<FeatureValue> >*, long&) in libTurboActivate.a(Activation.o) ActivationData::LoadProductKey() in libTurboActivate.a(ActivationData.o) ActivationData::Load() in libTurboActivate.a(ActivationData.o) ...

In the next bugfix release (4.0.4) we'll also include static libraries of TurboActivate and TurboFloat built with libc++.

Cool, let me know if you need help.

Hi,

Can you inform me about the status of this issue?Is it implemented in v4.0.4 because there is no reference in the corresponding release notes?

We haven't compiled TA/TF with the newer C++ library. We hadn't had time to do it yet (it's more than a simple recompile).

Ok, I understand that it's not so simple.

At the moment, we are trying to develop an application compatible with OSX 10.8 - OSX 10.12.This application depends on other libraries as well and there is a limitation to the compiler and the way of linking.As a result, we have to select the static linking with TA.

To be more specific the project setup is the following:- Xcode 6.2, Apple LLVM 6.0- Base SDK: 10.10, Deployment target: 10.8- C++ Language Dialect: c++11- C++ Standard Library: LLVM libc++- Added references to Frameworks and libraries ( https://wyday.com/limelm/help/using-turboactivate-on-mac-os-x/#static-lib)- Added libstdc++.6.dylib (https://wyday.com/forum/t/2916/mac-static-linking-error/#post-14376). I think that this breaks the OSX 10.8 compatibility.

Can you propose a solution to our problem?

In the latest version 4.0.8 the static libraries on Linux are fixed. Are you going to release a bugfix for MAC static libraries?

TurboActivate 4.0.9 and TurboFloat 4.0.9 are now out and include builds for both libstdc++ and libc++. Thanks for your patience, this took a bit of work to get done.