Question on usage of clang on windows with cmake and ninja

Hello all,

I am currently trying to use clang compiler on Windows 7 (64bit), I have built LLVM and clang from sources (master branch) using VS 2015.

Now I am trying to rebuild the LLVM and clang using clang itself.

So I am stuck setting correct configuration for cmake.

I am running the following command:


And after that the first test fails with linkage error:

   CMakeFiles\cmTC_8f103.dir\testCCompiler.c.obj -o cmTC_8f103.exe
   -Wl,--major-image-version,0,--minor-image-version,0 && cd ."

   LINK : warning LNK4044: unrecognized option '/-out-implib'; ignored

   LINK : warning LNK4044: unrecognized option '/-major-image-version';

   LINK : warning LNK4044: unrecognized option '/-minor-image-version';

   LINK : fatal error LNK1181: cannot open input file 'libcmTC_8f103.dll.a'

   clang.exe: error: linker command failed with exit code 1181 (use -v to see

I have found similar bug:

However it is for WinXP and is marked as already fixed.

Also here is similar unsolved discussion SO: Building c++ project on Windows with CMake, Clang and Ninja - Stack Overflow

Here is clang version which I am trying to use:

$ clang --version
clang version 3.9.0
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Users\del\work\llvm\bin

It would be great is somebody could point me on what am I doing wrong?

Thanks in advance!

Try clang-cl instead, like this:
$ cmake … -GNinja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl

If you use the other command line syntax, it looks like CMake has mingw-ish assumptions about what linker flags are valid.

Hello Reid,

thanks a lot for your answer, it helped. As far as I understood from the documentation: one needs to use clang-cl if he wants to use visual studio runtime. The clang.exe and clang++.exe binaries are intended to be used only with mingw runtime (and libc++ is not yet available for windows). Am I correct?

The version of clang you have is configured to target the MSVC runtime, so I mistakenly assumed that’s what you wanted. :slight_smile:

If you want to use mingw, you can either pass --target=i686-w64-windows-gnu to every compile step, or reconfigure and rebuild clang with -DLLVM_DEFAULT_TARGET_TRIPLE=i686-w64-windows-gnu.

I think passing ‘-DCMAKE_C_FLAGS=–target=i686-w64-windows-gnu -DCMAKE_CXX_FLAGS=–target=i686-w64-windows-gnu’ to the second stage build is enough, but I could be wrong, I don’t have experience building mingw64 clang.