[CMake] Copying DLLs to output directory

Robert Dailey rcdailey.lists at gmail.com
Fri Oct 31 15:11:23 EDT 2014


I like this idea but it doesn't seem like it will work for targets
with multiple DLLs... for example boost. It has several DLLs. I don't
want to define 1 target for each DLL either. Sometimes that doesn't
make sense.

On Wed, Oct 29, 2014 at 10:45 AM, Hendrk Sattler
<post at hendrik-sattler.de> wrote:
> Am 2014-10-28 18:25, schrieb Robert Dailey:
>>
>> I have a third party library like OpenSSL prebuilt for each platform
>> and in my own structure in version control. I have a CMake script that
>> creates an INTERFACE library target for it. I setup the include
>> directories and link targets. However, I don't see a way to configure
>> DLLs in the interface library target. How would you do this, and what
>> would CMake do to these targets to make sure they are copied to the
>> output directory of the executable I run from Visual Studio for
>> debugging?
>
>
> I have this for ZLib:
> if ( ZLIB_FOUND )
>   if ( WIN32 )
>     get_filename_component( ZLIB_LIBDIR "${ZLIB_LIBRARY}" PATH )
>     get_filename_component ( ZLIB_BASENAME "${ZLIB_LIBRARY}" NAME_WE )
>     get_filename_component ( ZLIB_LIBDIR_BASE "${ZLIB_LIBDIR}" PATH )
>     find_file ( ZLIB_DLL
> "${CMAKE_SHARED_LIBRARY_PREFIX}${ZLIB_BASENAME}${CMAKE_SHARED_LIBRARY_SUFFIX}"
>       HINTS
>         "${ZLIB_LIBDIR_BASE}"
>       PATH_SUFFIXES
>         bin
>       NO_DEFAULT_PATH
>     )
>     mark_as_advanced ( ZLIB_DLL )
>     if ( ZLIB_DLL )
>       add_library ( zlib SHARED IMPORTED GLOBAL )
>       set_property ( TARGET zlib PROPERTY IMPORTED_IMPLIB "${ZLIB_LIBRARY}"
> )
>       set_property ( TARGET zlib PROPERTY IMPORTED_LOCATION "${ZLIB_DLL}" )
>     else ( ZLIB_DLL )
>       add_library ( zlib STATIC IMPORTED GLOBAL )
>       set_property ( TARGET zlib PROPERTY IMPORTED_LOCATION
> "${ZLIB_LIBRARY}" )
>     endif ( ZLIB_DLL )
>   else( WIN32 )
>     add_library ( zlib UNKNOWN IMPORTED GLOBAL )
>     set_property ( TARGET zlib PROPERTY IMPORTED_LOCATION "${ZLIB_LIBRARY}"
> )
>   endif( WIN32 )
>   set_property ( TARGET zlib PROPERTY INTERFACE_INCLUDE_DIRECTORIES
>     "${ZLIB_INCLUDE_DIR}"
>   )
>
>   set ( ZLIB_LIBRARIES zlib )
>   set ( ZLIB_INCLUDE_DIRS "${ZLIB_INCLUDE_DIR}" )
> endif ( ZLIB_FOUND )
>
> The .lib goes into IMPORTED_IMPLIB and the .dll goes into IMPORTED_LOCATION.
> The way to find the .dll from the location of the .lib might differ for
> different libraries.
> For ZLib, the base name is the same.
>
> Later, you can use this imported target:
>   add_custom_command ( TARGET myTarget POST_BUILD
>     COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:zlib>
> $<TARGET_FILE_DIR:myTarget>
>   )
> Now, zlib.dll is in the same directory as myTarget.dll.
>
> HS
>
>> On Tue, Oct 28, 2014 at 12:21 AM, Hendrik Sattler
>> <post at hendrik-sattler.de> wrote:
>>>
>>> Hi,
>>>
>>> you can use generator expression in a post build rule to copy the dll
>>> file to the same target dir as the target you link it with. The easiest way
>>> to do this is to properly define all 3rd party libraries as imported targets
>>> that contains both, the lib and the dll file.
>>> Sadly, the FindQt4 on Windows doesn't do this and thus make life harder
>>> than needed. CMake configuration files should always do this right.
>>>
>>> OTOH, you could also write a wrapper batch file or change VS properties
>>> to modify PATH to include all libraries before the regular path.
>>>
>>> HS
>>>
>>>
>>> Am 28. Oktober 2014 02:55:08 MEZ, schrieb Robert Dailey
>>> <rcdailey.lists at gmail.com>:
>>>>
>>>> This actually used to be a very difficult problem to solve. However,
>>>> to debug in visual studio it's essential.
>>>>
>>>> If I have DLLs located in third party directories OR from targets that
>>>> I depend on, those must all be copied to the directory of the
>>>> executable I'm debugging in order for those DLLs to be found and
>>>> loaded.
>>>>
>>>> Using CMake 3.0.2, I hope this task is simpler, especially with the
>>>> introduction of a nice suite of generator expressions. Can anyone
>>>> recommend a good way to do this?
>>>
>>>
>> --
>>
>> 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:
>> http://public.kitware.com/mailman/listinfo/cmake
>
> --
>
> 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:
> http://public.kitware.com/mailman/listinfo/cmake


More information about the CMake mailing list