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
<p...@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.li...@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

Reply via email to