Osman Zakir via llvm-dev
2018-Dec-12 16:16 UTC
[llvm-dev] Using LLD to link against third-party libraries? How?
I need them so I can build stuff using clang or clang-cl with its C++ standard libraries. To make sure that lld-link won't give errors about missing symbols from any standard libraries. By the way, you wouldn't happen to know how to use link.exe, would you? I might need some help on that to understand how to use lld-link.exe. ________________________________ From: Zachary Turner <zturner at google.com> Sent: Wednesday, December 12, 2018 9:02 PM To: Osman Zakir; llvm-dev Subject: Re: [llvm-dev] Using LLD to link against third-party libraries? How? Do you have a specific reason for enabling libcxx and libcxxabi? Because I would strongly suggest disabling them otherwise On Wed, Dec 12, 2018 at 7:47 AM Osman Zakir <osmanzakir90 at hotmail.com<mailto:osmanzakir90 at hotmail.com>> wrote: I was asking about zlib because CMake couldn't find zlib. There was no error in the configuration, but knowing how to set the path to zlib would still be nice. I enabled clang, lld, lldb, libcxx and libcxxabi when configuring the build with CMake. What projects should I build aside from ALL_BUILD.vcxproj and INSTALL.vcxproj to make sure I get the libcxx and libcxxabi projects built as well, along with lld, lldb and clang? I didn't know about the bootstrapping Clang with itself bit, so I didn't do that. ________________________________ From: Zachary Turner <zturner at google.com<mailto:zturner at google.com>> Sent: Wednesday, December 12, 2018 8:40 PM To: Osman Zakir Cc: llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> Subject: Re: [llvm-dev] Using LLD to link against third-party libraries? How? If you want to bootstrap clang and lld using itself, then you should pass -DCMAKE_C_COMPILER=path/to/clang-cl.exe -DCMAKE_CXX_COMPILER=path/to/clang-cl.exe -DCMAKE_LINKER=path/to/lld-link.exe. Note the clang-cl.exe. ***Not*** clang.exe or clang++.exe. On Wed, Dec 12, 2018 at 7:37 AM Zachary Turner <zturner at google.com<mailto:zturner at google.com>> wrote: You shouldn't need zlib to build. I think we discussed in a previous thread that the only components you should need to complete a build are Microsoft Visual Studio, git, and CMake. On Wed, Dec 12, 2018 at 7:14 AM Osman Zakir via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote: How can I tell CMake during the configuration step where to find my zlib installation? ________________________________ From: blubee blubeeme <gurenchan at gmail.com<mailto:gurenchan at gmail.com>> Sent: Wednesday, December 12, 2018 7:31 PM To: Osman Zakir Cc: llvm-dev Subject: Re: [llvm-dev] Using LLD to link against third-party libraries? How? I would agree with the next email from Brian Cain If you do not have specific reason to want to use llvm lld try to use your system provided c++ linker. Bootstrapping the llvm c++ c++abi can be troublesome on Unix like platforms and I have no experience doing anything like that on windows. If you already have a c++ toochain and still want to attempt this then you'll need to svn checkout or git clone a version of the llvm toolchain and build it with your native toolchain then switch to using clang and lld. if you do not have a native c++ toolchain; let's cross that bridge only if you need to. A complete LLVM toolchain includes llvm clang clang-extra-tools lld lldb polly compiler-rt openmp libcxx libcxx-abi testsuite There's "Getting Started Quickly (A Summary" : https://llvm.org/docs/GettingStarted.html With steps to build a complete toolchain. Compilation could take a long time. It would be simpler to use your native c++ and linker unless they do not provide c++17 in which case the above link can get you started. Best On Wed, Dec 12, 2018 at 8:57 PM Osman Zakir <osmanzakir90 at hotmail.com<mailto:osmanzakir90 at hotmail.com>> wrote: So how do I get it to build libcxx and libcxxabi? I got it from the mono repo and enabled lld, clang, libcxx and libcxxabi. But I built the two main CMake targets only--all_build and install. What else do I have to do? Please let me know. ________________________________ From: Zachary Turner <zturner at google.com<mailto:zturner at google.com>> Sent: Wednesday, December 12, 2018 11:10 AM To: blubee blubeeme Cc: Osman Zakir; David Greene; llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> Subject: Re: [llvm-dev] Using LLD to link against third-party libraries? How? I see you’re using lld-link, so we’re talking about Windows here. Have you gotten it working with the Microsoft linker? Because if so, just replace link.exe with lld-link.exe and it will work. Btw, it’s a bit odd to use clang++ on Windows. The recommended workflow is to use clang-cl. It’s possible to use clang++, but you’re just setting yourself up for more difficulty On Tue, Dec 11, 2018 at 7:23 PM blubee blubeeme via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote: I couldn't get it to build libcxx... You need c++ and c++abi to compile c++ code. On Wed, Dec 12, 2018, 07:01 Osman Zakir via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote: LLVM on a Developer Command Prompt. The ones I want to fix first are the ones from Boost and Jinja2Cpp. I saw some from those as well. If there any standard library ones missing, could it be because I couldn't get it to build libcxx? I did try to include that, but it seems to be missing. What should I do? ________________________________ From: David Greene <dag at cray.com<mailto:dag at cray.com>> Sent: Wednesday, December 12, 2018 3:30 AM To: Osman Zakir Cc: blubee blubeeme; llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> Subject: Re: [llvm-dev] Using LLD to link against third-party libraries? How? Are you linking with a C++ compiler? A lot of those missing symbols look like they come from the C++ standard library. -David Osman Zakir via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> writes:> @blubee blubeeme So what do you think? Got any ideas? > ---------------------------------------------------------------------- > From: Osman Zakir <osmanzakir90 at hotmail.com<mailto:osmanzakir90 at hotmail.com>> > Sent: Wednesday, December 12, 2018 1:43 AM > To: llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> > Subject: Re: [llvm-dev] Using LLD to link against third-party > libraries? How? > In my code here https://github.com/DragonOsman/currency_converter , I > used C++17 and managed to get it to work (though I'm only using > std::map::insert_or_assign() from C++17). And I'm using Windows, so I > shouldn't use LDFLAGS or CXXFLAGS as environment variables. I'll use > them directly on the compiler command line instead. The libraries I > need to link against are > C:/boost_1_68_0/stage/lib/libboost_system-vc141-mt-x64-1_68.lib and > C:/Jinja2Cpp/install_x64/lib/static/jinja2cpp.lib. > > I tried to build it with this flag: > " > clang++ -std=c++17 -Wall -pedantic - > D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING - > Dvariant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD - > D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING - > D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32 - > D_WIN32_WINDOWS -D_NDEBUG -fexceptions - > IC:/Jinja2Cpp/install_x64/include -IC:/json/single_include - > IC:/boost_1_68_0 - > LC:/boost_1_68_0/stage/lib/libboost_system-vc141-mt-x64-1_68.lib - > LC:/Jinja2Cpp/install_x64/lib/static/jinja2cpp.lib > currency_converter.cpp -o currency_converter.exe > " > And I got these warnings and errors from LLD: > > " > lld-link: warning: > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally > defined symbol imported: __std_terminate (defined in libvcruntime.lib > (ehhelpers.obj)) [LNK4217] > lld-link: error: undefined symbol: "public: __cdecl > jinja2::Template::Template(class jinja2::TemplateEnv *)" > (??0Template at jinja2@@QEAA at PEAVTemplateEnv@1@@Z) >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > _cdecl handle_request<struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > std::allocator<char>, struct server_session::send_lambda &>(class > boost::basic_string_view<char, struct std::char_traits<char>>, struct > boost::beast::http::message<1, struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > struct server_session::send_lambda &, char const *, char const *)" > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V? > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V?$basic_ > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda@server_session@@PEBD3 at Z) > ) > > lld-link: error: undefined symbol: "public: class > nonstd::expected_lite::expected<void, class > jinja2::ErrorInfoTpl<char>> __cdecl jinja2::Template::LoadFromFile > (class std::basic_string<char, struct std::char_traits<char>, class > std::allocator<char>> const &)" > (?LoadFromFile at Template@jinja2@@QEAA?AV?$expected at XV?$ErrorInfoTpl at D@jinja2@@@expected_ > lite at nonstd@@AEBV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@@Z) > >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > _cdecl handle_request<struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > std::allocator<char>, struct server_session::send_lambda &>(class > boost::basic_string_view<char, struct std::char_traits<char>>, struct > boost::beast::http::message<1, struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > struct server_session::send_lambda &, char const *, char const *)" > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V? > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V?$basic_ > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda@server_session@@PEBD3 at Z) > ) > > lld-link: error: undefined symbol: "public: class > std::basic_string<char, struct std::char_traits<char>, class > std::allocator<char>> __cdecl jinja2::Template::RenderAsString(class > std::unordered_map<class std::basic_string<char, struct > std::char_traits<char>, class std::allocator<char>>, class > jinja2::Value, struct std::hash<class std::basic_string<char, struct > std::char_traits<char>, class std::allocator<char>>>, struct > std::equal_to<class std::basic_string<char, struct > std::char_traits<char>, class std::allocator<char>>>, class > std::allocator<struct std::pair<class std::basic_string<char, struct > std::char_traits<char>, class std::allocator<char>> const, class > jinja2::Value>>> const &)" > (?RenderAsString at Template@jinja2@@QEAA?AV?$basic_string at DU?$char_traits at D@std@@V? > $allocator at D@2@@std@@AEBV?$unordered_map at V?$basic_string at DU?$char_traits at D@std@@V? > $allocator at D@2@@std@@VValue at jinja2@@U?$hash at V?$basic_string at DU?$char_traits at D@std@@V? > $allocator at D@2@@std@@@2 at U?$equal_to at V?$basic_string at DU?$char_traits at D@std@@V? > $allocator at D@2@@std@@@2 at V?$allocator at U?$pair@$$CBV?$basic_string at DU?$char_ > traits at D@std@@V?$allocator at D@2@@std@@VValue at jinja2@@@std@@@2@@4@@Z) >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > _cdecl handle_request<struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > std::allocator<char>, struct server_session::send_lambda &>(class > boost::basic_string_view<char, struct std::char_traits<char>>, struct > boost::beast::http::message<1, struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > struct server_session::send_lambda &, char const *, char const *)" > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V? > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V?$basic_ > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda@server_session@@PEBD3 at Z) > ) >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > _cdecl handle_request<struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > std::allocator<char>, struct server_session::send_lambda &>(class > boost::basic_string_view<char, struct std::char_traits<char>>, struct > boost::beast::http::message<1, struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > struct server_session::send_lambda &, char const *, char const *)" > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V? > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V?$basic_ > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda@server_session@@PEBD3 at Z) > ) > > lld-link: error: undefined symbol: "public: __cdecl > jinja2::Template::~Template(void)" (??1Template at jinja2@@QEAA at XZ) >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > _cdecl handle_request<struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > std::allocator<char>, struct server_session::send_lambda &>(class > boost::basic_string_view<char, struct std::char_traits<char>>, struct > boost::beast::http::message<1, struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > struct server_session::send_lambda &, char const *, char const *)" > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V? > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V?$basic_ > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda@server_session@@PEBD3 at Z) > ) >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("int > `void __cdecl handle_request<struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > std::allocator<char>, struct server_session::send_lambda &>(class > boost::basic_string_view<char, struct std::char_traits<char>>, struct > basic_string_view<char, struct > std::char_traits<char>>::beast::http::message<1, struct > boost::beast::http::basic_string_body<char, struct > std::char_traits<char>, class std::allocator<char>>, class > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > struct server_session::send_lambda &, char const *, char const *)':: > `1'::dtor$114" > (?dtor$114@?0???$handle_request at U?$basic_string_body at DU?$char_traits at D@std@@V? > $allocator at D@2@@http at beast@boost@@V?$allocator at D@std@@AEAUsend_lambda at server_ > session@@@@YAXV?$basic_string_view at DU?$char_traits at D@std@@@boost@@$$QEAU? > $message@$00U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@@V? > $basic_fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda@server_ > session@@PEBD3 at Z@4HA)) > > lld-link: warning: > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally > defined symbol imported: _CxxThrowException (defined in > libvcruntime.lib(throw.obj)) [LNK4217] > lld-link: error: undefined symbol: "class > boost::system::error_category const & __cdecl > boost::system::detail::system_category_ncx(void)" > (?system_category_ncx at detail@system at boost@@YAAEBVerror_category at 23@XZ) >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("class > boost::system::error_category const & __cdecl > boost::system::system_category(void)" > (?system_category at system@boost@@YAAEBVerror_category at 12@XZ)) > > lld-link: warning: > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally > defined symbol imported: __RTDynamicCast (defined in libvcruntime.lib > (rtti.obj)) [LNK4217] > lld-link: error: undefined symbol: "class > boost::system::error_category const & __cdecl > boost::system::detail::generic_category_ncx(void)" > (?generic_category_ncx at detail@system at boost@@YAAEBVerror_category at 23@XZ) > >>>> referenced by > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("class > boost::system::error_category const & __cdecl > boost::system::generic_category(void)" > (?generic_category at system@boost@@YAAEBVerror_category at 12@XZ)) > clang++: error: linker command failed with exit code 1 (use -v to see > invocation) > " > > > * GitHub - DragonOsman/currency_converter: Application for Computer > Science course > Google Maps + Currency Converter Web Application. Application for > Computer Science course. This is a currency converter web > application with the frontend and a backend. > github.com<http://github.com> > > * > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev_______________________________________________ LLVM Developers mailing list llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev _______________________________________________ LLVM Developers mailing list llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev _______________________________________________ LLVM Developers mailing list llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181212/4c50a13f/attachment-0001.html>
Zachary Turner via llvm-dev
2018-Dec-12 16:33 UTC
[llvm-dev] Using LLD to link against third-party libraries? How?
You don’t need clang’s standard libraries in order to not get linker errors with lld-link. In fact, I would strongly suggest not trying to use them, at least until you get a working build. Once you get a working build, then if you realllly want to you can try to complicate it by using libcxx. Until then, keep it simple and use Microsoft standard library (which happens automatically and “just works” So for now, I suggest removing libcxx and libcxxabi from your cmake configurations On Wed, Dec 12, 2018 at 8:16 AM Osman Zakir via llvm-dev < llvm-dev at lists.llvm.org> wrote:> I need them so I can build stuff using clang or clang-cl with its C++ > standard libraries. To make sure that lld-link won't give errors about > missing symbols from any standard libraries. > > By the way, you wouldn't happen to know how to use link.exe, would you? I > might need some help on that to understand how to use lld-link.exe. > ------------------------------ > *From:* Zachary Turner <zturner at google.com> > *Sent:* Wednesday, December 12, 2018 9:02 PM > *To:* Osman Zakir; llvm-dev > > *Subject:* Re: [llvm-dev] Using LLD to link against third-party > libraries? How? > > Do you have a specific reason for enabling libcxx and libcxxabi? Because > I would strongly suggest disabling them otherwise > > On Wed, Dec 12, 2018 at 7:47 AM Osman Zakir <osmanzakir90 at hotmail.com> > wrote: > > I was asking about zlib because CMake couldn't find zlib. There was no > error in the configuration, but knowing how to set the path to zlib would > still be nice. > > I enabled clang, lld, lldb, libcxx and libcxxabi when configuring the > build with CMake. What projects should I build aside from > ALL_BUILD.vcxproj and INSTALL.vcxproj to make sure I get the libcxx and > libcxxabi projects built as well, along with lld, lldb and clang? > > I didn't know about the bootstrapping Clang with itself bit, so I didn't > do that. > ------------------------------ > *From:* Zachary Turner <zturner at google.com> > *Sent:* Wednesday, December 12, 2018 8:40 PM > *To:* Osman Zakir > *Cc:* llvm-dev at lists.llvm.org > > *Subject:* Re: [llvm-dev] Using LLD to link against third-party > libraries? How? > > If you want to bootstrap clang and lld using itself, then you should pass > -DCMAKE_C_COMPILER=path/to/clang-cl.exe > -DCMAKE_CXX_COMPILER=path/to/clang-cl.exe > -DCMAKE_LINKER=path/to/lld-link.exe. > > Note the clang-cl.exe. ***Not*** clang.exe or clang++.exe. > > On Wed, Dec 12, 2018 at 7:37 AM Zachary Turner <zturner at google.com> wrote: > > You shouldn't need zlib to build. I think we discussed in a previous > thread that the only components you should need to complete a build are > Microsoft Visual Studio, git, and CMake. > > On Wed, Dec 12, 2018 at 7:14 AM Osman Zakir via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > > How can I tell CMake during the configuration step where to find my zlib > installation? > ------------------------------ > *From:* blubee blubeeme <gurenchan at gmail.com> > *Sent:* Wednesday, December 12, 2018 7:31 PM > > *To:* Osman Zakir > *Cc:* llvm-dev > *Subject:* Re: [llvm-dev] Using LLD to link against third-party > libraries? How? > I would agree with the next email from Brian Cain > > If you do not have specific reason to want to use llvm lld try to use your > system provided c++ linker. > > Bootstrapping the llvm c++ c++abi can be troublesome on Unix like > platforms and I have no experience doing anything like that on windows. > > If you already have a c++ toochain and still want to attempt this then > you'll need to svn checkout or git clone a version of the llvm toolchain > and build it with your native toolchain then switch to using clang and lld. > > if you do not have a native c++ toolchain; let's cross that bridge only if > you need to. > > A complete LLVM toolchain includes > llvm > clang > clang-extra-tools > lld > lldb > polly > compiler-rt > openmp > libcxx > libcxx-abi > testsuite > There's "Getting Started Quickly (A Summary" : > https://llvm.org/docs/GettingStarted.html > > With steps to build a complete toolchain. Compilation could take a long > time. > > It would be simpler to use your native c++ and linker unless they do not > provide c++17 in which case the above link can get you started. > > Best > > On Wed, Dec 12, 2018 at 8:57 PM Osman Zakir <osmanzakir90 at hotmail.com> > wrote: > > So how do I get it to build libcxx and libcxxabi? I got it from the mono > repo and enabled lld, clang, libcxx and libcxxabi. But I built the two > main CMake targets only--all_build and install. What else do I have to > do? Please let me know. > ------------------------------ > *From:* Zachary Turner <zturner at google.com> > *Sent:* Wednesday, December 12, 2018 11:10 AM > *To:* blubee blubeeme > *Cc:* Osman Zakir; David Greene; llvm-dev at lists.llvm.org > *Subject:* Re: [llvm-dev] Using LLD to link against third-party > libraries? How? > > I see you’re using lld-link, so we’re talking about Windows here. > > Have you gotten it working with the Microsoft linker? Because if so, just > replace link.exe with lld-link.exe and it will work. > > Btw, it’s a bit odd to use clang++ on Windows. The recommended workflow is > to use clang-cl. It’s possible to use clang++, but you’re just setting > yourself up for more difficulty > On Tue, Dec 11, 2018 at 7:23 PM blubee blubeeme via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > > I couldn't get it to build libcxx... > You need c++ and c++abi to compile c++ code. > > > On Wed, Dec 12, 2018, 07:01 Osman Zakir via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > > LLVM on a Developer Command Prompt. The ones I want to fix first are the > ones from Boost and Jinja2Cpp. I saw some from those as well. > > If there any standard library ones missing, could it be because I couldn't > get it to build libcxx? I did try to include that, but it seems to be > missing. What should I do? > ------------------------------ > *From:* David Greene <dag at cray.com> > *Sent:* Wednesday, December 12, 2018 3:30 AM > *To:* Osman Zakir > *Cc:* blubee blubeeme; llvm-dev at lists.llvm.org > > *Subject:* Re: [llvm-dev] Using LLD to link against third-party > libraries? How? > > Are you linking with a C++ compiler? A lot of those missing symbols > look like they come from the C++ standard library. > > -David > > Osman Zakir via llvm-dev <llvm-dev at lists.llvm.org> writes: > > > @blubee blubeeme So what do you think? Got any ideas? > > ---------------------------------------------------------------------- > > From: Osman Zakir <osmanzakir90 at hotmail.com> > > Sent: Wednesday, December 12, 2018 1:43 AM > > To: llvm-dev at lists.llvm.org > > Subject: Re: [llvm-dev] Using LLD to link against third-party > > libraries? How? > > In my code here https://github.com/DragonOsman/currency_converter , I > > used C++17 and managed to get it to work (though I'm only using > > std::map::insert_or_assign() from C++17). And I'm using Windows, so I > > shouldn't use LDFLAGS or CXXFLAGS as environment variables. I'll use > > them directly on the compiler command line instead. The libraries I > > need to link against are > > C:/boost_1_68_0/stage/lib/libboost_system-vc141-mt-x64-1_68.lib and > > C:/Jinja2Cpp/install_x64/lib/static/jinja2cpp.lib. > > > > I tried to build it with this flag: > > " > > clang++ -std=c++17 -Wall -pedantic - > > D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING - > > Dvariant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD - > > D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING - > > D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32 - > > D_WIN32_WINDOWS -D_NDEBUG -fexceptions - > > IC:/Jinja2Cpp/install_x64/include -IC:/json/single_include - > > IC:/boost_1_68_0 - > > LC:/boost_1_68_0/stage/lib/libboost_system-vc141-mt-x64-1_68.lib - > > LC:/Jinja2Cpp/install_x64/lib/static/jinja2cpp.lib > > currency_converter.cpp -o currency_converter.exe > > " > > And I got these warnings and errors from LLD: > > > > " > > lld-link: warning: > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally > > defined symbol imported: __std_terminate (defined in libvcruntime.lib > > (ehhelpers.obj)) [LNK4217] > > lld-link: error: undefined symbol: "public: __cdecl > > jinja2::Template::Template(class jinja2::TemplateEnv *)" > > (??0Template at jinja2@@QEAA at PEAVTemplateEnv@1@@Z) > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > > _cdecl handle_request<struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > std::allocator<char>, struct server_session::send_lambda &>(class > > boost::basic_string_view<char, struct std::char_traits<char>>, struct > > boost::beast::http::message<1, struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > > struct server_session::send_lambda &, char const *, char const *)" > > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ > @V?$allocator at D@2@@http at beast@boost@@V? > > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ > @V?$basic_ > > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda > @server_session@@PEBD3 at Z) > > ) > > > > lld-link: error: undefined symbol: "public: class > > nonstd::expected_lite::expected<void, class > > jinja2::ErrorInfoTpl<char>> __cdecl jinja2::Template::LoadFromFile > > (class std::basic_string<char, struct std::char_traits<char>, class > > std::allocator<char>> const &)" > > (?LoadFromFile at Template@jinja2@@QEAA?AV?$expected at XV?$ErrorInfoTpl at D > @jinja2@@@expected_ > > lite at nonstd@@AEBV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@ > @std@@@Z) > > > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > > _cdecl handle_request<struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > std::allocator<char>, struct server_session::send_lambda &>(class > > boost::basic_string_view<char, struct std::char_traits<char>>, struct > > boost::beast::http::message<1, struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > > struct server_session::send_lambda &, char const *, char const *)" > > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ > @V?$allocator at D@2@@http at beast@boost@@V? > > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ > @V?$basic_ > > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda > @server_session@@PEBD3 at Z) > > ) > > > > lld-link: error: undefined symbol: "public: class > > std::basic_string<char, struct std::char_traits<char>, class > > std::allocator<char>> __cdecl jinja2::Template::RenderAsString(class > > std::unordered_map<class std::basic_string<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > jinja2::Value, struct std::hash<class std::basic_string<char, struct > > std::char_traits<char>, class std::allocator<char>>>, struct > > std::equal_to<class std::basic_string<char, struct > > std::char_traits<char>, class std::allocator<char>>>, class > > std::allocator<struct std::pair<class std::basic_string<char, struct > > std::char_traits<char>, class std::allocator<char>> const, class > > jinja2::Value>>> const &)" > > (?RenderAsString at Template@jinja2@@QEAA?AV?$basic_string at DU > ?$char_traits at D@std@@V? > > $allocator at D@2@@std@@AEBV?$unordered_map at V?$basic_string at DU > ?$char_traits at D@std@@V? > > $allocator at D@2@@std@@VValue at jinja2@@U?$hash at V?$basic_string at DU > ?$char_traits at D@std@@V? > > $allocator at D@2@@std@@@2 at U?$equal_to at V?$basic_string at DU?$char_traits at D > @std@@V? > > $allocator at D@2@@std@@@2 at V?$allocator at U?$pair@$$CBV?$basic_string at DU > ?$char_ > > traits at D@std@@V?$allocator at D@2@@std@@VValue at jinja2@@@std@@@2@@4@@Z) > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > > _cdecl handle_request<struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > std::allocator<char>, struct server_session::send_lambda &>(class > > boost::basic_string_view<char, struct std::char_traits<char>>, struct > > boost::beast::http::message<1, struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > > struct server_session::send_lambda &, char const *, char const *)" > > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ > @V?$allocator at D@2@@http at beast@boost@@V? > > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ > @V?$basic_ > > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda > @server_session@@PEBD3 at Z) > > ) > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > > _cdecl handle_request<struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > std::allocator<char>, struct server_session::send_lambda &>(class > > boost::basic_string_view<char, struct std::char_traits<char>>, struct > > boost::beast::http::message<1, struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > > struct server_session::send_lambda &, char const *, char const *)" > > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ > @V?$allocator at D@2@@http at beast@boost@@V? > > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ > @V?$basic_ > > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda > @server_session@@PEBD3 at Z) > > ) > > > > lld-link: error: undefined symbol: "public: __cdecl > > jinja2::Template::~Template(void)" (??1Template at jinja2@@QEAA at XZ) > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ > > _cdecl handle_request<struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > std::allocator<char>, struct server_session::send_lambda &>(class > > boost::basic_string_view<char, struct std::char_traits<char>>, struct > > boost::beast::http::message<1, struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > > struct server_session::send_lambda &, char const *, char const *)" > > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ > @V?$allocator at D@2@@http at beast@boost@@V? > > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ > > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ > > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ > @V?$basic_ > > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda > @server_session@@PEBD3 at Z) > > ) > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("int > > `void __cdecl handle_request<struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > std::allocator<char>, struct server_session::send_lambda &>(class > > boost::basic_string_view<char, struct std::char_traits<char>>, struct > > basic_string_view<char, struct > > std::char_traits<char>>::beast::http::message<1, struct > > boost::beast::http::basic_string_body<char, struct > > std::char_traits<char>, class std::allocator<char>>, class > > boost::beast::http::basic_fields<class std::allocator<char>>> &&, > > struct server_session::send_lambda &, char const *, char const *)':: > > `1'::dtor$114" > > (?dtor$114@?0???$handle_request at U?$basic_string_body at DU?$char_traits at D > @std@@V? > > $allocator at D@2@@http at beast@boost@@V?$allocator at D@std@ > @AEAUsend_lambda at server_ > > session@@@@YAXV?$basic_string_view at DU?$char_traits at D@std@@@boost@ > @$$QEAU? > > $message@$00U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D > @2@@http at beast@boost@@V? > > $basic_fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda > @server_ > > session@@PEBD3 at Z@4HA)) > > > > lld-link: warning: > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally > > defined symbol imported: _CxxThrowException (defined in > > libvcruntime.lib(throw.obj)) [LNK4217] > > lld-link: error: undefined symbol: "class > > boost::system::error_category const & __cdecl > > boost::system::detail::system_category_ncx(void)" > > (?system_category_ncx at detail@system at boost@@YAAEBVerror_category at 23@XZ) > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("class > > boost::system::error_category const & __cdecl > > boost::system::system_category(void)" > > (?system_category at system@boost@@YAAEBVerror_category at 12@XZ)) > > > > lld-link: warning: > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally > > defined symbol imported: __RTDynamicCast (defined in libvcruntime.lib > > (rtti.obj)) [LNK4217] > > lld-link: error: undefined symbol: "class > > boost::system::error_category const & __cdecl > > boost::system::detail::generic_category_ncx(void)" > > (?generic_category_ncx at detail@system at boost@@YAAEBVerror_category at 23@XZ) > > > >>>> referenced by > > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("class > > boost::system::error_category const & __cdecl > > boost::system::generic_category(void)" > > (?generic_category at system@boost@@YAAEBVerror_category at 12@XZ)) > > clang++: error: linker command failed with exit code 1 (use -v to see > > invocation) > > " > > > > > > * GitHub - DragonOsman/currency_converter: Application for Computer > > Science course > > Google Maps + Currency Converter Web Application. Application for > > Computer Science course. This is a currency converter web > > application with the frontend and a backend. > > github.com > > > > * > > > > > > _______________________________________________ > > LLVM Developers mailing list > > llvm-dev at lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181212/2ef1d0f9/attachment.html>
Zachary Turner via llvm-dev
2018-Dec-12 16:58 UTC
[llvm-dev] Using LLD to link against third-party libraries? How?
Here's a simple example of how to compile a trivial program into a .lib file, and then link against it. $ cat a.cpp int afunc(int x) { return x; } $ cat main.cpp #include <iostream> int afunc(int x); int main(int argc, char **argv) { std::cout << "afunc returned " << afunc(argc) << "\n"; } // compile the first file $ clang-cl.exe /c a.cpp // make a .lib file out of it, similar to the boost library you're trying to link against. $ llvm-lib.exe a.obj // compile the second file $ clang-cl.exe /c main.cpp // link the main source file and the static library to produce an executable $ lld-link.exe main.obj a.lib /out:main.exe // run the executable $ main.exe afunc returned 1 The full documentation of linker flags for link.exe is here: https://docs.microsoft.com/en-us/cpp/build/reference/linker-options?view=vs-2017 lld-link supports most (but not all) of those, but it's unlikely you'll run into one of those cases. On Wed, Dec 12, 2018 at 8:33 AM Zachary Turner <zturner at google.com> wrote:> You don’t need clang’s standard libraries in order to not get linker > errors with lld-link. In fact, I would strongly suggest not trying to use > them, at least until you get a working build. Once you get a working > build, then if you realllly want to you can try to complicate it by using > libcxx. Until then, keep it simple and use Microsoft standard library > (which happens automatically and “just works” > > So for now, I suggest removing libcxx and libcxxabi from your cmake > configurations > > On Wed, Dec 12, 2018 at 8:16 AM Osman Zakir via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> I need them so I can build stuff using clang or clang-cl with its C++ >> standard libraries. To make sure that lld-link won't give errors about >> missing symbols from any standard libraries. >> >> By the way, you wouldn't happen to know how to use link.exe, would you? >> I might need some help on that to understand how to use lld-link.exe. >> ------------------------------ >> *From:* Zachary Turner <zturner at google.com> >> *Sent:* Wednesday, December 12, 2018 9:02 PM >> *To:* Osman Zakir; llvm-dev >> >> *Subject:* Re: [llvm-dev] Using LLD to link against third-party >> libraries? How? >> >> Do you have a specific reason for enabling libcxx and libcxxabi? Because >> I would strongly suggest disabling them otherwise >> >> On Wed, Dec 12, 2018 at 7:47 AM Osman Zakir <osmanzakir90 at hotmail.com> >> wrote: >> >> I was asking about zlib because CMake couldn't find zlib. There was no >> error in the configuration, but knowing how to set the path to zlib would >> still be nice. >> >> I enabled clang, lld, lldb, libcxx and libcxxabi when configuring the >> build with CMake. What projects should I build aside from >> ALL_BUILD.vcxproj and INSTALL.vcxproj to make sure I get the libcxx and >> libcxxabi projects built as well, along with lld, lldb and clang? >> >> I didn't know about the bootstrapping Clang with itself bit, so I didn't >> do that. >> ------------------------------ >> *From:* Zachary Turner <zturner at google.com> >> *Sent:* Wednesday, December 12, 2018 8:40 PM >> *To:* Osman Zakir >> *Cc:* llvm-dev at lists.llvm.org >> >> *Subject:* Re: [llvm-dev] Using LLD to link against third-party >> libraries? How? >> >> If you want to bootstrap clang and lld using itself, then you should pass >> -DCMAKE_C_COMPILER=path/to/clang-cl.exe >> -DCMAKE_CXX_COMPILER=path/to/clang-cl.exe >> -DCMAKE_LINKER=path/to/lld-link.exe. >> >> Note the clang-cl.exe. ***Not*** clang.exe or clang++.exe. >> >> On Wed, Dec 12, 2018 at 7:37 AM Zachary Turner <zturner at google.com> >> wrote: >> >> You shouldn't need zlib to build. I think we discussed in a previous >> thread that the only components you should need to complete a build are >> Microsoft Visual Studio, git, and CMake. >> >> On Wed, Dec 12, 2018 at 7:14 AM Osman Zakir via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >> How can I tell CMake during the configuration step where to find my zlib >> installation? >> ------------------------------ >> *From:* blubee blubeeme <gurenchan at gmail.com> >> *Sent:* Wednesday, December 12, 2018 7:31 PM >> >> *To:* Osman Zakir >> *Cc:* llvm-dev >> *Subject:* Re: [llvm-dev] Using LLD to link against third-party >> libraries? How? >> I would agree with the next email from Brian Cain >> >> If you do not have specific reason to want to use llvm lld try to use >> your system provided c++ linker. >> >> Bootstrapping the llvm c++ c++abi can be troublesome on Unix like >> platforms and I have no experience doing anything like that on windows. >> >> If you already have a c++ toochain and still want to attempt this then >> you'll need to svn checkout or git clone a version of the llvm toolchain >> and build it with your native toolchain then switch to using clang and lld. >> >> if you do not have a native c++ toolchain; let's cross that bridge only >> if you need to. >> >> A complete LLVM toolchain includes >> llvm >> clang >> clang-extra-tools >> lld >> lldb >> polly >> compiler-rt >> openmp >> libcxx >> libcxx-abi >> testsuite >> There's "Getting Started Quickly (A Summary" : >> https://llvm.org/docs/GettingStarted.html >> >> With steps to build a complete toolchain. Compilation could take a long >> time. >> >> It would be simpler to use your native c++ and linker unless they do not >> provide c++17 in which case the above link can get you started. >> >> Best >> >> On Wed, Dec 12, 2018 at 8:57 PM Osman Zakir <osmanzakir90 at hotmail.com> >> wrote: >> >> So how do I get it to build libcxx and libcxxabi? I got it from the mono >> repo and enabled lld, clang, libcxx and libcxxabi. But I built the two >> main CMake targets only--all_build and install. What else do I have to >> do? Please let me know. >> ------------------------------ >> *From:* Zachary Turner <zturner at google.com> >> *Sent:* Wednesday, December 12, 2018 11:10 AM >> *To:* blubee blubeeme >> *Cc:* Osman Zakir; David Greene; llvm-dev at lists.llvm.org >> *Subject:* Re: [llvm-dev] Using LLD to link against third-party >> libraries? How? >> >> I see you’re using lld-link, so we’re talking about Windows here. >> >> Have you gotten it working with the Microsoft linker? Because if so, just >> replace link.exe with lld-link.exe and it will work. >> >> Btw, it’s a bit odd to use clang++ on Windows. The recommended workflow >> is to use clang-cl. It’s possible to use clang++, but you’re just setting >> yourself up for more difficulty >> On Tue, Dec 11, 2018 at 7:23 PM blubee blubeeme via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >> I couldn't get it to build libcxx... >> You need c++ and c++abi to compile c++ code. >> >> >> On Wed, Dec 12, 2018, 07:01 Osman Zakir via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >> LLVM on a Developer Command Prompt. The ones I want to fix first are the >> ones from Boost and Jinja2Cpp. I saw some from those as well. >> >> If there any standard library ones missing, could it be because I >> couldn't get it to build libcxx? I did try to include that, but it seems >> to be missing. What should I do? >> ------------------------------ >> *From:* David Greene <dag at cray.com> >> *Sent:* Wednesday, December 12, 2018 3:30 AM >> *To:* Osman Zakir >> *Cc:* blubee blubeeme; llvm-dev at lists.llvm.org >> >> *Subject:* Re: [llvm-dev] Using LLD to link against third-party >> libraries? How? >> >> Are you linking with a C++ compiler? A lot of those missing symbols >> look like they come from the C++ standard library. >> >> -David >> >> Osman Zakir via llvm-dev <llvm-dev at lists.llvm.org> writes: >> >> > @blubee blubeeme So what do you think? Got any ideas? >> > ---------------------------------------------------------------------- >> > From: Osman Zakir <osmanzakir90 at hotmail.com> >> > Sent: Wednesday, December 12, 2018 1:43 AM >> > To: llvm-dev at lists.llvm.org >> > Subject: Re: [llvm-dev] Using LLD to link against third-party >> > libraries? How? >> > In my code here https://github.com/DragonOsman/currency_converter , I >> > used C++17 and managed to get it to work (though I'm only using >> > std::map::insert_or_assign() from C++17). And I'm using Windows, so I >> > shouldn't use LDFLAGS or CXXFLAGS as environment variables. I'll use >> > them directly on the compiler command line instead. The libraries I >> > need to link against are >> > C:/boost_1_68_0/stage/lib/libboost_system-vc141-mt-x64-1_68.lib and >> > C:/Jinja2Cpp/install_x64/lib/static/jinja2cpp.lib. >> > >> > I tried to build it with this flag: >> > " >> > clang++ -std=c++17 -Wall -pedantic - >> > D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING - >> > Dvariant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD - >> > D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING - >> > D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32 - >> > D_WIN32_WINDOWS -D_NDEBUG -fexceptions - >> > IC:/Jinja2Cpp/install_x64/include -IC:/json/single_include - >> > IC:/boost_1_68_0 - >> > LC:/boost_1_68_0/stage/lib/libboost_system-vc141-mt-x64-1_68.lib - >> > LC:/Jinja2Cpp/install_x64/lib/static/jinja2cpp.lib >> > currency_converter.cpp -o currency_converter.exe >> > " >> > And I got these warnings and errors from LLD: >> > >> > " >> > lld-link: warning: >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally >> > defined symbol imported: __std_terminate (defined in libvcruntime.lib >> > (ehhelpers.obj)) [LNK4217] >> > lld-link: error: undefined symbol: "public: __cdecl >> > jinja2::Template::Template(class jinja2::TemplateEnv *)" >> > (??0Template at jinja2@@QEAA at PEAVTemplateEnv@1@@Z) >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ >> > _cdecl handle_request<struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > std::allocator<char>, struct server_session::send_lambda &>(class >> > boost::basic_string_view<char, struct std::char_traits<char>>, struct >> > boost::beast::http::message<1, struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > boost::beast::http::basic_fields<class std::allocator<char>>> &&, >> > struct server_session::send_lambda &, char const *, char const *)" >> > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ >> @V?$allocator at D@2@@http at beast@boost@@V? >> > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ >> > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ >> > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ >> @V?$basic_ >> > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda >> @server_session@@PEBD3 at Z) >> > ) >> > >> > lld-link: error: undefined symbol: "public: class >> > nonstd::expected_lite::expected<void, class >> > jinja2::ErrorInfoTpl<char>> __cdecl jinja2::Template::LoadFromFile >> > (class std::basic_string<char, struct std::char_traits<char>, class >> > std::allocator<char>> const &)" >> > (?LoadFromFile at Template@jinja2@@QEAA?AV?$expected at XV?$ErrorInfoTpl at D >> @jinja2@@@expected_ >> > lite at nonstd@@AEBV?$basic_string at DU?$char_traits at D@std@@V?$allocator at D >> @2@@std@@@Z) >> > >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ >> > _cdecl handle_request<struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > std::allocator<char>, struct server_session::send_lambda &>(class >> > boost::basic_string_view<char, struct std::char_traits<char>>, struct >> > boost::beast::http::message<1, struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > boost::beast::http::basic_fields<class std::allocator<char>>> &&, >> > struct server_session::send_lambda &, char const *, char const *)" >> > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ >> @V?$allocator at D@2@@http at beast@boost@@V? >> > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ >> > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ >> > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ >> @V?$basic_ >> > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda >> @server_session@@PEBD3 at Z) >> > ) >> > >> > lld-link: error: undefined symbol: "public: class >> > std::basic_string<char, struct std::char_traits<char>, class >> > std::allocator<char>> __cdecl jinja2::Template::RenderAsString(class >> > std::unordered_map<class std::basic_string<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > jinja2::Value, struct std::hash<class std::basic_string<char, struct >> > std::char_traits<char>, class std::allocator<char>>>, struct >> > std::equal_to<class std::basic_string<char, struct >> > std::char_traits<char>, class std::allocator<char>>>, class >> > std::allocator<struct std::pair<class std::basic_string<char, struct >> > std::char_traits<char>, class std::allocator<char>> const, class >> > jinja2::Value>>> const &)" >> > (?RenderAsString at Template@jinja2@@QEAA?AV?$basic_string at DU >> ?$char_traits at D@std@@V? >> > $allocator at D@2@@std@@AEBV?$unordered_map at V?$basic_string at DU >> ?$char_traits at D@std@@V? >> > $allocator at D@2@@std@@VValue at jinja2@@U?$hash at V?$basic_string at DU >> ?$char_traits at D@std@@V? >> > $allocator at D@2@@std@@@2 at U?$equal_to at V?$basic_string at DU?$char_traits at D >> @std@@V? >> > $allocator at D@2@@std@@@2 at V?$allocator at U?$pair@$$CBV?$basic_string at DU >> ?$char_ >> > traits at D@std@@V?$allocator at D@2@@std@@VValue at jinja2@@@std@@@2@@4@@Z) >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ >> > _cdecl handle_request<struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > std::allocator<char>, struct server_session::send_lambda &>(class >> > boost::basic_string_view<char, struct std::char_traits<char>>, struct >> > boost::beast::http::message<1, struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > boost::beast::http::basic_fields<class std::allocator<char>>> &&, >> > struct server_session::send_lambda &, char const *, char const *)" >> > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ >> @V?$allocator at D@2@@http at beast@boost@@V? >> > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ >> > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ >> > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ >> @V?$basic_ >> > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda >> @server_session@@PEBD3 at Z) >> > ) >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ >> > _cdecl handle_request<struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > std::allocator<char>, struct server_session::send_lambda &>(class >> > boost::basic_string_view<char, struct std::char_traits<char>>, struct >> > boost::beast::http::message<1, struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > boost::beast::http::basic_fields<class std::allocator<char>>> &&, >> > struct server_session::send_lambda &, char const *, char const *)" >> > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ >> @V?$allocator at D@2@@http at beast@boost@@V? >> > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ >> > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ >> > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ >> @V?$basic_ >> > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda >> @server_session@@PEBD3 at Z) >> > ) >> > >> > lld-link: error: undefined symbol: "public: __cdecl >> > jinja2::Template::~Template(void)" (??1Template at jinja2@@QEAA at XZ) >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("void _ >> > _cdecl handle_request<struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > std::allocator<char>, struct server_session::send_lambda &>(class >> > boost::basic_string_view<char, struct std::char_traits<char>>, struct >> > boost::beast::http::message<1, struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > boost::beast::http::basic_fields<class std::allocator<char>>> &&, >> > struct server_session::send_lambda &, char const *, char const *)" >> > (??$handle_request at U?$basic_string_body at DU?$char_traits at D@std@ >> @V?$allocator at D@2@@http at beast@boost@@V? >> > $allocator at D@std@@AEAUsend_lambda at server_session@@@@YAXV?$basic_string_ >> > view at DU?$char_traits at D@std@@@boost@@$$QEAU?$message@$00U?$basic_string_ >> > body at DU?$char_traits at D@std@@V?$allocator at D@2@@http at beast@boost@ >> @V?$basic_ >> > fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda >> @server_session@@PEBD3 at Z) >> > ) >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("int >> > `void __cdecl handle_request<struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > std::allocator<char>, struct server_session::send_lambda &>(class >> > boost::basic_string_view<char, struct std::char_traits<char>>, struct >> > basic_string_view<char, struct >> > std::char_traits<char>>::beast::http::message<1, struct >> > boost::beast::http::basic_string_body<char, struct >> > std::char_traits<char>, class std::allocator<char>>, class >> > boost::beast::http::basic_fields<class std::allocator<char>>> &&, >> > struct server_session::send_lambda &, char const *, char const *)':: >> > `1'::dtor$114" >> > (?dtor$114@?0???$handle_request at U?$basic_string_body at DU?$char_traits at D >> @std@@V? >> > $allocator at D@2@@http at beast@boost@@V?$allocator at D@std@ >> @AEAUsend_lambda at server_ >> > session@@@@YAXV?$basic_string_view at DU?$char_traits at D@std@@@boost@ >> @$$QEAU? >> > $message@$00U?$basic_string_body at DU?$char_traits at D@std@@V?$allocator at D >> @2@@http at beast@boost@@V? >> > $basic_fields at V?$allocator at D@std@@@234@@http at beast@1 at AEAUsend_lambda >> @server_ >> > session@@PEBD3 at Z@4HA)) >> > >> > lld-link: warning: >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally >> > defined symbol imported: _CxxThrowException (defined in >> > libvcruntime.lib(throw.obj)) [LNK4217] >> > lld-link: error: undefined symbol: "class >> > boost::system::error_category const & __cdecl >> > boost::system::detail::system_category_ncx(void)" >> > (?system_category_ncx at detail@system at boost@@YAAEBVerror_category at 23@XZ) >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("class >> > boost::system::error_category const & __cdecl >> > boost::system::system_category(void)" >> > (?system_category at system@boost@@YAAEBVerror_category at 12@XZ)) >> > >> > lld-link: warning: >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o: locally >> > defined symbol imported: __RTDynamicCast (defined in libvcruntime.lib >> > (rtti.obj)) [LNK4217] >> > lld-link: error: undefined symbol: "class >> > boost::system::error_category const & __cdecl >> > boost::system::detail::generic_category_ncx(void)" >> > (?generic_category_ncx at detail@system at boost@@YAAEBVerror_category at 23@XZ) >> > >> >>>> referenced by >> > C:\Users\Osman\AppData\Local\Temp\currency_converter-264ae1.o:("class >> > boost::system::error_category const & __cdecl >> > boost::system::generic_category(void)" >> > (?generic_category at system@boost@@YAAEBVerror_category at 12@XZ)) >> > clang++: error: linker command failed with exit code 1 (use -v to see >> > invocation) >> > " >> > >> > >> > * GitHub - DragonOsman/currency_converter: Application for Computer >> > Science course >> > Google Maps + Currency Converter Web Application. Application for >> > Computer Science course. This is a currency converter web >> > application with the frontend and a backend. >> > github.com >> > >> > * >> > >> > >> > _______________________________________________ >> > LLVM Developers mailing list >> > llvm-dev at lists.llvm.org >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181212/da7b2b4b/attachment.html>
David Chisnall via llvm-dev
2018-Dec-14 10:10 UTC
[llvm-dev] Using LLD to link against third-party libraries? How?
On 12/12/2018 16:16, Osman Zakir via llvm-dev wrote:> I need them so I can build stuff using clang or clang-cl with its C++ > standard libraries. To make sure that lld-link won't give errors about > missing symbols from any standard libraries.Looking at your linker errors, it looks as if this is the root of the problem. Different C++ standard library implementations may be source compatible, but they are *not* binary compatible. If you have compiled some library with the native toolchain (or downloaded a pre-built library built with the native toolchain) then all of its interfaces that use standard library types will depend on the version from your Visual Studio C++ standard library. When you compile with libc++, you will get undefined symbols in your binary that refer to versions of these functions using the libc++ versions of the same source-language types. When you try to link this with the library, it will fail because the library doesn't expose those symbols. If you want to link C++ libraries, you need to make sure that they were compiled and linked with the same C++ standard library. On Windows, most native libraries expose either C or COM interfaces to avoid any dependency at the boundary on C++ library types. David
Osman Zakir via llvm-dev
2018-Dec-14 20:37 UTC
[llvm-dev] Using LLD to link against third-party libraries? How?
Okay, but normally you'd want to use the C++ standard library of the compiler you're using, right? Does LLVM not work that way? To me, it makes more sense to use the Windows native C++ standard library with the MSVC compiler, libc++ with Clang, GCC's with GCC (what's it called again? I don't remember). -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181214/e8065b38/attachment.html>