Clang with the MSVC API can't link DLLs with WINDOWS_EXPORT_ALL_SYMBOLS
This can be reproduced with clang-cl and cmake (any version that supports it), and also with clang/clang++ with the changes in !3527 (merged).
clang with lto builds static libraries, executables, and shared libraries without WINDOWS_EXPORT_ALL_SYMBOLS
.
WINDOWS_EXPORT_ALL_SYMBOLS
results in cmake additionally invoking its own bindexplib
, which tries to parse the object file... and fails similarly to the MSVC linker, as it can only handle the MS normal and bigobj formats.
A simple test is:
cmake_minimum_required(VERSION 3.10)
project(simple-test)
add_library(foo SHARED foo.cpp)
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION ON)
set_property(TARGET foo PROPERTY WINDOWS_EXPORT_ALL_SYMBOLS ON)
foo.cpp can be anything, as long as it successfully compiles into an object file.
Build this with:
set CC=clang-cl
set CXX=clang-cl
cmake -GNinja -DCMAKE_LINKER=lld-link
ninja
And the linker command will fail with unrecognized file format in 'CMakeFiles\foo.dir\foo.cpp.obj'
, generated by cmake -E __create_def
Edited by Zsolt Parragi