<div dir="ltr">On Sun, May 13, 2018 at 1:41 PM, Michael Ho <<a href="mailto:CraftedCart@outlook.com">CraftedCart@outlook.com</a>> wrote:<br>><br>> Hey there.<br>><br>> 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.<br>><br>> clang++.exe: error: no such file or directory: 'ws2editor/libws2editor.dll.a'<br>><br>> 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.<br>><br>><br>> After a bit more digging around I came across <a href="https://github.com/Kitware/CMake/blob/master/Tests/Plugin/CMakeLists.txt">https://github.com/Kitware/CMake/blob/master/Tests/Plugin/CMakeLists.txt</a> - 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).<br>><br>> So how can I get the CMake build on Windows to create this file, or otherwise link with an executable?<br><br>You need to 1. mark some/all symbols to export 2. actually export them<br><div>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 <a href="https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/">https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/</a>, check also comments for possible drawbacks).</div><div><br></div><div><a href="https://github.com/Kitware/CMake/blob/master/Tests/Plugin/include/example.h">https://github.com/Kitware/CMake/blob/master/Tests/Plugin/include/example.h</a> shows how to use __declspec(dllexport): for each dll you define a macro (<span class="gmail-pl-en">EXAMPLE_EXPORT</span> 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 (<span class="gmail-pl-smi">example_exe_function</span>). For class members, it's enough to mark the class.</div><div>Finally there's a #define (example_exe_EXPORTS here) that controls how is the macro defined. See <a href="https://cmake.org/cmake/help/git-master/prop_tgt/DEFINE_SYMBOL.html">https://cmake.org/cmake/help/git-master/prop_tgt/DEFINE_SYMBOL.html</a> (I didn't know this until now, we used to manually define the symbol!)<br></div><div><br></div><div>Jano<br></div></div>