This is a follow-on from "Linking object libraries into a Windows DLL in 3.12rc1"[1] - I figured since I'm reframing that question I should start a new thread.
I have a project that has some common code and about a hundred modules. The modules can have dependencies on each other (only ever as a directed acyclic graph). What I want to do is, for any given module, compile it into a single Windows DLL using MSVC (currently v19 under Visual Studio 2017). This is already possible with existing build scripts, but these are becoming unmaintainable. The existing scripts compile each individual module into an .obj file and finally link them all into a DLL, as in: cl.exe [args] common\common.c (creates common.obj) cl.exe [args] modules\module1\module1.c (creates module1.obj) ... cl.exe [args] modules\moduleN\ moduleN.c (creates moduleN.obj) link.exe [args] common.obj module1.obj [...] moduleN.obj (creates moduleN.dll) (Not shown: the macros to create the declspec declaration that MSVC needs to know what to export in the DLL. It's a type in moduleN and some functions in common.) I'm trying to figure out a way to do this with CMake that doesn't require me to flatten out the entire dependency graph by hand. Each module has, alongside it, a list of the other modules it *directly* depends on. These are easy to put into a eg. target_link_libraries(...) call. But I can't figure out how to get CMake to walk the whole dependency graph and pull everything into the final link command. Note that it doesn't have to be done with steps I describe above, if there's another way to produce a single DLL I don't care how it happens. What I've tried: 1. Making all the modules shared libs. This just produces a bunch of separate DLLs for each module and common. 2. Chuck Atkins' post[2] suggesting separating usage requirements and objects into different libraries. Since target objects don't propagate using this method, it didn't help. 3. Now that 3.12rc1 is out, I tried using target_link_libraries() on the object libraries themselves[1]. But as I found out from my previous post, target objects don't propagate this way either. I'd appreciate any pointers. It seems like this is something that CMake is designed to do, but I just can't figure out how. I have a very minimal example (2 modules and common code) at https://gitlab.com/detly/cmake-dll-ex which shows my attempt using object libraries, if that helps. [1] http://cmake.3232098.n2.nabble.com/Linking-object-libraries-into-a-Windows-DLL-in-3-12rc1-td7597756.html [2] http://cmake.3232098.n2.nabble.com/OBJECT-libraries-and-working-around-lake-of-target-link-libraries-tp7595795p7595830.html Thanks, Jason
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake