[CMake] IMPORTED DLL-only Target on MSVC

Stuermer, Michael SP/HZA-ZSEP michael.stuermer at schaeffler.com
Tue Apr 3 00:17:32 EDT 2018


> -----Ursprüngliche Nachricht-----
> Von: CMake [mailto:cmake-bounces at cmake.org] Im Auftrag von Marek
> Vojtko (Firaxis)
> Gesendet: Dienstag, 3. April 2018 00:49
> An: cmake at cmake.org
> Betreff: [CMake] IMPORTED DLL-only Target on MSVC
> 
> Hi,
> 
> 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. When I create an IMPORTED target

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.

> and depend on it via target_link_libraries() I run into linkage issues, because
> on MSVC CMake puts the DLL into the linker command (the "Input" text field
> in the "Linker" settings of the Project Properties).
> 
> add_library( MyDependency::MyDependency MODULE IMPORTED )
> set_target_properties( MyDependency::MyDependency
>     PROPERTIES
>         INTERFACE_INCLUDE_DIRECTORIES "${MyDependency_INCLUDE_DIR}"
>         IMPORTED_LOCATION "${MyDependency_SHARED_LIB}"
> )
> [..]
> add_executable( MyExecutable ... )
> target_link_libraries( MyExecutable PRIVATE
> MyDependency::MyDependency )
> 
> I tried changing the library type in my add_library() call:
> - STATIC obviously didn't work, because I don't have a .lib file and the .dll file
> in IMPORTED_LOCATION was added to MyExecutable's linker line.
> - SHARED did not work because CMake expects a .dll in
> IMPORTED_LOCATION and a .lib in IMPORTED_IMP_LOCATION, so
> MyExecutable's linker line had a MyDependency::MyDependency-
> NOTFOUND entry in it.
> - MODULE seemed like the right choice when reading the documentation,
> but MyExecutable's linker line still contains the .dll file specified in
> IMPORTED_LOCATION.
> 
> What am I doing wrong?
> 
> 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