The 2024 Wheel Reinvention Jam is in 16 days. September 23-29, 2024. More info

Clang-cl and Microsoft's link.exe

When I build through 4coder, Clang-cl cannot seem to find link.exe. The directory the linker is in my path, and 4coder is launched with this script

1
2
3
4
5
6
7
8
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -no_logo
set path=[Redacted]\Documents\project920\code;%path%

pushd [Redacted]\Documents\project920\code
start C:\4coder\4ed.exe
popd

start devenv


This is the directory for the linker in my path:
1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.24728\bin\


But this is the error Clang-cl gives

1
2
clang-cl.exe: error: unable to execute command: program not executable
clang-cl.exe: error: linker command failed with exit code 1 (use -v to see invocation)


The full error log can be found here : https://gist.github.com/anonymous/4f334a9a5051960331ea5d78d5a79407

It's not clear what exactly is the issue. Has anyone ran into this?
does that directory end up in %path% after the call to VsDevCmd.bat?
Who, from where and how calls clang-cl.exe ?

Edited by Mārtiņš Možeiko on
ratchetfreak
does that directory end up in %path% after the call to VsDevCmd.bat?


Yes. I confirmed this by printing the %PATH% variable at the end of the startup script.

mmozeiko
Who, from where and how calls clang-cl.exe ?


My build.bat, which is inside my project/code directory. The actual line that gets ran is

1
clang-cl %CommonCompilerFlags% [Redacted]\project\code\jesse.cpp /LD %CommonLinkerFlags% -PDB:jesse_%random%.pdb /EXPORT:GameUpdate

Edited by Jesse on
can you check that the %path% is properly propagated down to the build.bat?
ratchetfreak
can you check that the %path% is properly propagated down to the build.bat?


Yup, it does.
Are you able to run clang-cl.exe successfully (including linker) from .bat file that calls VsDevCmd? Without calling 4coder.
mmozeiko
Are you able to run clang-cl.exe successfully (including linker) from .bat file that calls VsDevCmd? Without calling 4coder.


Hmm, there seems to be progress here.

1
2
3
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -no_logo
clang-cl.exe: warning: unknown argument ignored in clang-cl: '-PDB:jesse_15885.pdb' [-Wunknown-argument]
clang-cl.exe: error: no such file or directory: '/EXPORT:GameUpdate'


But I don't know how to address these errors, because I don't know what's causing them.
clang-cl.exe doesn't support exactly same arguments as cl.exe. There are differences: http://clang.llvm.org/docs/UsersManual.html#clang-cl

You probably would want to use clang native arguments - cl.exe compatible arguments cannot express all that clang supports. I think they are there only to make porting from cl.exe to clang a bit easier.

Edited by Mārtiņš Možeiko on
Yes, I am aware of those. The plan is to eventually shift over, but I need to get it working with what I have first.

Do you have an idea why calling Clang-cl from within a batch file using 4coder doesn't seem to work?

Edited by Jesse on
No idea. I don't use 4coder and have no idea how it works when calling external commands.

What happens if you put call to VsDevCmd.bat file inside build.bat?
Interestingly that doesn't work. Same errors as before.
Then 4coder is not a problem here. You need to figure how to use clang-cl, before putting it into 4coder.
mmozeiko
Then 4coder is not a problem here.


The logic for how everything goes together is now twisty enough that I don't have a clear idea how you arrived at that conclusion. Can you elaborate?
If build.bat sets up environment (vsdevcmd.bat) and in same file calls clang-cl, then it shouldn't matter where from build.bat is called. I haven't used VS2017, but if vsdevcmd.bat is something like vcvarsall.bat from previous VS versions, then clang-cl should work after call to vsdevcmd unless something else is wrong.