[CMake] IMPORTED DLL-only Target on MSVC

Stuermer, Michael SP/HZA-ZSEP michael.stuermer at schaeffler.com
Wed Apr 4 00:45:49 EDT 2018


> -----Ursprüngliche Nachricht-----
> Von: CMake [mailto:cmake-bounces at cmake.org] Im Auftrag von Marek
> Vojtko (Firaxis)
> Gesendet: Dienstag, 3. April 2018 23:24
> An: cmake at cmake.org
> Betreff: Re: [CMake] IMPORTED DLL-only Target on MSVC
> 
> > > Is it not possible to wrap an external DLL-only library in an IMPORTED
> target?
> > >
> >
> > Yes it is.
> >
> > > I have an external dependency that is a single DLL (shared library)
> > > and a header file, but no LIB (static library) file.
> >
> > How does this work in Visual Studio C++? If I am not completely
> > mistaken you ALWAYS need a .lib file along with your .dll to link to
> > the shared library. And you Need a header with the API as well of course.
> >
> > The only case I know with .dll and without .lib file is when you have
> > managed
> > C++ or C# targets.
> >
> 
> The DLL gets loaded using LoadLibrary("MyDependency.dll") at runtime and
> its functions are accessed through GetProcAddress():

Ok, I missed this case :-). But in my opinion MyDependency.dll is not a TARGET in
the sense of CMake targets. It's just a variable/filename which is used in the project
somewhere. This is actually also how Visual Studio treats the .dll: you only pass
the filename somewhere, not mentioning "link to this" or something else.

If you want to deploy/copy the .dll to your binary directory I'd simply add a
POST_BUILD custom command which copies the file over so you don't have to
do it manually.

> 
> HINSTANCE hLib = LoadLibrary(DLL_NAME);
> If(hLib)
> {
>     typedef int (*DLL_FUNC)();
>     myFunc = (DLL_FUNC)GetProcAddress(hLib, "DLLFunction"); }
> 
> Like I said, it's an external dependency and I don't have any control over it.
> The dependency's include directories have to be added to my executable's
> include directories and I need to copy the DLL next to the executable. I
> thought I'd solve (at least the include directories) by creating an IMPORTED
> target, but no matter what I try, the DLL ends up in the linker command line,
> wreaking havoc.

Adding include directories/files only via target could be done by putting the
Include files in a INTERFACE library. Not sure if this is an elegant solution for
your case but I'd probably start like this.

> 
> Of course I can work around this issue by not creating an IMPORTED target
> and just relying on two variables (MyDependency_INCLUDE_DIR and
> MyDependency_SHARED_LIB). Before I do, however, I wanted to make sure
> that CMake does not in fact support a DLL-and-header-only library set up.
> 
> Thanks,
> Marek
> 
> --
> 
> 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


More information about the CMake mailing list