[llvm-dev] Building A Project Against LLVM

Rarrum via llvm-dev llvm-dev at lists.llvm.org
Fri May 15 20:57:01 PDT 2020


I'd rather avoid updating my OS at the moment or setting up a VM.  But the
cmake comments were a hint.. I suspect something is going wrong in there
preventing it from adding the actual library files to the linker
commandline.

I added this to my CMakeLists.txt:
set(CMAKE_VERBOSE_MAKEFILE on)

Which shows no LLVM libs at all being passed in:

[  8%] Linking CXX executable ../bin/CBreakCompiler
/usr/bin/c++     CMakeFiles/CBreakCompiler.dir/src/main.cpp.o
CMakeFiles/CBreakCompiler.dir/src/Parser.cpp.o
CMakeFiles/CBreakCompiler.dir/src/SourceTokenizer.cpp.o
CMakeFiles/CBreakCompiler.dir/src/IRCompiler.cpp.o
CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o
CMakeFiles/CBreakCompiler.dir/src/JIT.cpp.o  -o ../bin/CBreakCompiler

If I change this:
llvm_map_components_to_libnames(llvm_libs all)
to:
llvm_map_components_to_libnames(llvm_libs core)

Then I start to see libraries being added:
[  8%] Linking CXX executable ../bin/CBreakCompiler
/usr/bin/c++     CMakeFiles/CBreakCompiler.dir/src/main.cpp.o
CMakeFiles/CBreakCompiler.dir/src/Parser.cpp.o
CMakeFiles/CBreakCompiler.dir/src/SourceTokenizer.cpp.o
CMakeFiles/CBreakCompiler.dir/src/IRCompiler.cpp.o
CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o
CMakeFiles/CBreakCompiler.dir/src/JIT.cpp.o  -o ../bin/CBreakCompiler
/usr/local/lib/libLLVMCore.a /usr/local/lib/libLLVMBinaryFormat.a
/usr/local/lib/libLLVMRemarks.a /usr/local/lib/libLLVMBitstreamReader.a
/usr/local/lib/libLLVMSupport.a -lrt -ldl -ltinfo -lpthread -lm
/usr/local/lib/libLLVMDemangle.a

Perhaps I can figure out which ones I need and manually specify them all,
rather than using "all".

On Fri, May 15, 2020 at 8:17 PM Mehdi AMINI <joker.eph at gmail.com> wrote:

>
>
> On Fri, May 15, 2020 at 6:53 PM Neil Nelson via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Rarrum,
>>
>> Kubuntu 20.04 LTS is available. You may be able to upgrade to 19.10, and
>> then to 20.04 without reinstalling. It can be done on Xubuntu. A direct
>> upgrade to 20.04 should become available. LLVM 10 then installs from the
>> distribution packages. I put all this on a VM using KVM/QEMU to keep it
>> isolated from my primary desktop environment. Building a 20.04 VM after
>> upgrading to 20.04 appears to give a faster VM. Use llvm's linker lld.
>>
>> The cmake version for 20.04 is 3.16.3 which should help with llvm's
>> recommended version.
>>
>
> Do you believe the error listed have to do with the CMake version?
>
>
>
>
>> Neil
>> On 5/15/20 12:05 AM, Rarrum via llvm-dev wrote:
>>
>> I decided to start playing around with building my own programming
>> language recently, and to use LLVM to handle the assembly-level details.
>> I'm on Kubuntu 18.04, and I started out using LLVM 6.0 from Kubuntu's
>> packages.  I put together code for dealing with my language, then went over
>> the Kaleidoscope tutorials (which have been extremely helpful btw!).  I was
>> able to successfully get my own compiler to generate IR using LLVM, use
>> PassManager to write that to a native .o file, use gcc to link that, and
>> execute a tiny program written in my own language.
>>
>> I also decided it was a good time to learn CMake, so I set up my project
>> using that.  The CMakeLists.txt file I'm using is essentially just taken
>> from: https://llvm.org/docs/CMake.html#embedding-llvm-in-your-project -
>> though originally it would not link.  From scouring the internet I made 2
>> changes to get that working: replaced "support core irreader" with "all",
>> and replaced "${llvm_libs}" with just "LLVM".
>>
>> However as I was starting to play with setting up JIT, I hit more
>> differences between the version of LLVM in Kubuntu and the version the
>> examples and documentation were written against.  So I decided to try to
>> update to a newer version of LLVM.. and this is where I've been stuck for
>> several days now.  Here are the steps I've taken:
>>
>> * Uninstalled any llvm packages I could find from Kubuntu's package
>> manager.
>> * Followed the getting started guide:
>> https://llvm.org/docs/GettingStarted.html - I git cloned LLVM, checked
>> out the 10.0.0 tag, ran cmake as instructed, with the Release type.  When
>> that completed successfully I ran sudo ninja install.
>> * I then went back to my project and adjusted a couple places to
>> successfully compile against the new version.
>> * At this point I put "${llvm_libs}" in the CMakeLists.txt file back to
>> match the example.  However I was getting a massive wall of link errors.
>> * I assumed I must have built LLVM incorrectly somehow, so in an effort
>> to undo that install, I deleted everything I could find under /usr/local
>> that had LLVM in its name, downloaded the 10.0 release from
>> https://releases.llvm.org/download.html for ubuntu 18.04, and extracted
>> that all to /usr/local.
>> * I can still successfully compile, but not link.
>>
>> At this point I'm not sure what to try next.  Is there additional
>> documentation somewhere for how to "install" a current release of LLVM
>> correctly?
>>
>>
>> For reference here's my final CMakeLists.txt file:
>>
>> cmake_minimum_required(VERSION 3.10)
>>
>> project(CBreakCompiler)
>>
>> set(CMAKE_CXX_STANDARD 17)
>> set(CMAKE_CXX_STANDARD_REQUIRED True)
>> add_compile_options(-Wall)
>>
>> find_package(LLVM 10.0.0 REQUIRED CONFIG)
>>
>> message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
>> message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
>>
>> include_directories(${LLVM_INCLUDE_DIRS})
>> add_definitions(${LLVM_DEFINITIONS})
>>
>> add_executable(CBreakCompiler
>>     src/main.cpp
>>     src/Parser.cpp
>>     src/SourceTokenizer.cpp
>>     src/IRCompiler.cpp
>>     src/CompiledOutput.cpp)
>>
>> llvm_map_components_to_libnames(llvm_libs all)
>> target_link_libraries(CBreakCompiler ${llvm_libs})
>>
>>
>> And a snippet from the cmake output corresponding to those message lines:
>>
>> -- Found LLVM 10.0.0
>> -- Using LLVMConfig.cmake in: /usr/local/lib/cmake/llvm
>>
>>
>> There are dozens of link errors.. the first few and last few are:
>>
>> CMakeFiles/CBreakCompiler.dir/src/main.cpp.o:(.data.rel+0x0): undefined
>> reference to `llvm::DisableABIBreakingChecks'
>> CMakeFiles/CBreakCompiler.dir/src/main.cpp.o: In function
>> `std::default_delete<llvm::LLVMContext>::operator()(llvm::LLVMContext*)
>> const':
>> main.cpp:(.text._ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_[_ZNKSt14default_deleteIN4llvm11LLVMContextEEclEPS1_]+0x1e):
>> undefined reference to `llvm::LLVMContext::~LLVMContext()'
>> ...
>> CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0xe0):
>> undefined reference to `llvm::raw_ostream::anchor()'
>> CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0xf8):
>> undefined reference to `typeinfo for llvm::raw_pwrite_stream'
>> CMakeFiles/CBreakCompiler.dir/src/CompiledOutput.cpp.o:(.data.rel.ro+0x110):
>> undefined reference to `typeinfo for llvm::raw_ostream'
>>
>>
> Seems like `llvm_map_components_to_libnames` wasn't populated well?
> I'd start by printing `${llvm_libs}` in your CMake to check the output
> of llvm_map_components_to_libnames, I don't know how the "all" works for
> external builds? You may have to list the components you need more
> explicitly instead?
>
> --
> Mehdi
>
>
>
>
>
>
>>
>> _______________________________________________
>> LLVM Developers mailing listllvm-dev at lists.llvm.orghttps://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://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/20200515/681d690a/attachment-0001.html>


More information about the llvm-dev mailing list