[CMake] Link against exe on Windows fails - .a file not found

Jano Svitok jan.svitok at gmail.com
Sun May 13 19:34:02 EDT 2018


On Sun, May 13, 2018 at 1:41 PM, Michael Ho <CraftedCart at outlook.com> wrote:
>
> Hey there.
>
> I'm trying to make a plugin system for my application, and thus each
plugin will need to link with my main application. This is fine on Linux
and macOS, as I can just set the ENABLE_EXPORTS property of my executable
target (set_target_properties(${PROJECT_NAME} PROPERTIES ENABLE_EXPORTS 1),
and plugins will link just fine. On Windows however, clang++ yells at me
that it can't find libws2editor.dll.a.
>
> clang++.exe: error: no such file or directory:
'ws2editor/libws2editor.dll.a'
>
> Upon looking over the CMake docs, it says "For DLL platforms an import
library will be created for the exported symbols and then used for
linking." - This import library file (presumably the .dll.a) never seems to
be created though.
>
>
> After a bit more digging around I came across
https://github.com/Kitware/CMake/blob/master/Tests/Plugin/CMakeLists.txt -
When I clone the CMake repo and try and compile that test myself, it also
fails with the same error when using clang + ninja! When building with
MSVC/msbuild however it compiles just fine (My project fails to configure
when generating files for MSVC however, and ideally I'd like to use the
same build config across Win/Mac/Linux).
>
> So how can I get the CMake build on Windows to create this file, or
otherwise link with an executable?

You need to 1. mark some/all symbols to export 2. actually export them
ENABLE_EXPORTS does #2. For #1, you need to either mark each symbol to
export as __declspec(dllexport) or mark all symbols with
WINDOWS_EXPORT_ALL_SYMBOLS (see
https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/,
check also comments for possible drawbacks).

https://github.com/Kitware/CMake/blob/master/Tests/Plugin/include/example.h
shows how to use __declspec(dllexport): for each dll you define a macro (
EXAMPLE_EXPORT here) that becomes either export (when #included from dll)
or import (when #included from code linked to dll). Every
class/function/variable you want to use from the plugin must be marked this
way (example_exe_function). For class members, it's enough to mark the
class.
Finally there's a #define (example_exe_EXPORTS here) that controls how is
the macro defined. See
https://cmake.org/cmake/help/git-master/prop_tgt/DEFINE_SYMBOL.html (I
didn't know this until now, we used to manually define the symbol!)

Jano
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180514/d19bdfff/attachment.html>


More information about the CMake mailing list