Skip to content

Unable to crosscompile project with GCC #505

@harraiken

Description

@harraiken

Hello,

I would like to build llvm-mingw for Windows under Linux using mingw-w64-gcc. Unfortunately, every time I run the build-llvm.sh script I get a bunch of 'undefined reference' errors, e.g. when linking libLTO.dll, e.g.:

undefined reference to llvm::StringMapImpl::hash(llvm::StringRef)'

This happens every time I execute the command: ./build-llvm.sh --host=x86_64-w64-mingw32 /LLVM_MINGW. It looks like the following command is used by the script to build the toolchain:

cmake -DCMAKE_INSTALL_PREFIX=/LLVM-MINGW -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=OFF -DLLVM_ENABLE_PROJECTS=clang;lld;lldb;clang-tools-extra -DLLVM_TARGETS_TO_BUILD=ARM;AArch64;X86;NVPTX -DLLVM_INSTALL_TOOLCHAIN_ONLY=ON -DLLVM_LINK_LLVM_DYLIB=ON -DLLVM_TOOLCHAIN_TOOLS=llvm-ar;llvm-ranlib;llvm-objdump;llvm-rc;llvm-cvtres;llvm-nm;llvm-strings;llvm-readobj;llvm-dlltool;llvm-pdbutil;llvm-objcopy;llvm-strip;llvm-cov;llvm-profdata;llvm-addr2line;llvm-symbolizer;llvm-windres;llvm-ml;llvm-readelf;llvm-size;llvm-cxxfilt;llvm-lib -DLLVM_HOST_TRIPLE=x86_64-w64-mingw32 -DLLVM_BUILD_INSTRUMENTED=OFF -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_RC_COMPILER=x86_64-w64-mingw32-windres -DCMAKE_FIND_ROOT_PATH=/usr/x86_64-w64-mingw32 -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY ..

CMAKE_FIND_ROOT_PATH correctly points to /usr/x86_64-w64-mingw32, where the GCC-based toolchain is installed. This directory contains the bin/, include/ and lib/ directories containing the mingw headers and libraries, among other things.

From what I have seen, llvm-mingw itself is used to build the Windows version. However, I already have GCC-based binaries of mingw-w64 installed and I wanted to use them so as not to compile LLVM twice. Finally, more error output:

/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$_ZTVN4llvm2cl11OptionValueIcEE[_ZTVN4llvm2cl11OptionValueIcEE]+0x18): undefined reference to llvm::cl::GenericOptionValue::anchor()' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$_ZTVN4llvm2cl11OptionValueIbEE[_ZTVN4llvm2cl11OptionValueIbEE]+0x18): undefined reference to llvm::cl::GenericOptionValue::anchor()'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$_ZTV24LTOToolDiagnosticHandler[_ZTV24LTOToolDiagnosticHandler]+0x28): undefined reference to llvm::DiagnosticHandler::isAnalysisRemarkEnabled(llvm::StringRef) const' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$_ZTV24LTOToolDiagnosticHandler[_ZTV24LTOToolDiagnosticHandler]+0x30): undefined reference to llvm::DiagnosticHandler::isMissedOptRemarkEnabled(llvm::StringRef) const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$_ZTV24LTOToolDiagnosticHandler[_ZTV24LTOToolDiagnosticHandler]+0x38): undefined reference to llvm::DiagnosticHandler::isPassedOptRemarkEnabled(llvm::StringRef) const' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$_ZTV24LTOToolDiagnosticHandler[_ZTV24LTOToolDiagnosticHandler]+0x40): undefined reference to llvm::DiagnosticHandler::isAnyRemarkEnabled() const'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm2cl6parserIbEE[.refptr._ZTVN4llvm2cl6parserIbEE]+0x0): undefined reference to vtable for llvm::cl::parser<bool>' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm2cl6parserIcEE[.refptr._ZTVN4llvm2cl6parserIcEE]+0x0): undefined reference to vtable for llvm::cl::parser'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm18raw_string_ostreamE[.refptr._ZTVN4llvm18raw_string_ostreamE]+0x0): undefined reference to vtable for llvm::raw_string_ostream' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm27DiagnosticPrinterRawOStreamE[.refptr._ZTVN4llvm27DiagnosticPrinterRawOStreamE]+0x0): undefined reference to vtable for llvm::DiagnosticPrinterRawOStream'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm2cl3optIcLb0ENS0_6parserIcEEEE[.refptr._ZTVN4llvm2cl3optIcLb0ENS0_6parserIcEEEE]+0x0): undefined reference to vtable for llvm::cl::opt<char, false, llvm::cl::parser<char> >' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm2cl6OptionE[.refptr._ZTVN4llvm2cl6OptionE]+0x0): undefined reference to vtable for llvm::cl::Option'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm2cl17basic_parser_implE[.refptr._ZTVN4llvm2cl17basic_parser_implE]+0x0): undefined reference to vtable for llvm::cl::basic_parser_impl' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm2cl3optIbLb0ENS0_6parserIbEEEE[.refptr._ZTVN4llvm2cl3optIbLb0ENS0_6parserIbEEEE]+0x0): undefined reference to vtable for llvm::cl::opt<bool, false, llvm::cl::parser >'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(lto.cpp.obj):lto.cpp:(.rdata$.refptr._ZTVN4llvm17DiagnosticHandlerE[.refptr._ZTVN4llvm17DiagnosticHandlerE]+0x0): undefined reference to vtable for llvm::DiagnosticHandler' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x5): undefined reference to LLVMInitializeARMTargetInfo'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0xa): undefined reference to LLVMInitializeAArch64TargetInfo' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0xf): undefined reference to LLVMInitializeX86TargetInfo'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x14): undefined reference to LLVMInitializeNVPTXTargetInfo' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x19): undefined reference to LLVMInitializeARMTargetMC'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x1e): undefined reference to LLVMInitializeAArch64TargetMC' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x23): undefined reference to LLVMInitializeX86TargetMC'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x28): undefined reference to LLVMInitializeNVPTXTargetMC' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x2d): undefined reference to LLVMInitializeARMAsmParser'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x32): undefined reference to LLVMInitializeAArch64AsmParser' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x37): undefined reference to LLVMInitializeX86AsmParser'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x3c): undefined reference to LLVMInitializeARMDisassembler' /usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x41): undefined reference to LLVMInitializeAArch64Disassembler'
/usr/bin/x86_64-w64-mingw32-ld: CMakeFiles/LTO.dir/objects.a(LTODisassembler.cpp.obj):LTODisassembler.cpp:(.text$lto_initialize_disassembler+0x4b): undefined reference to `LLVMInitializeX86Disassembler'

Any suggestions would be appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions