I just got in the habit of writing code that copies my 3rd party DLLs into the current CMake Binary directory (Like Qt, HDF5.. ). This lets me debug my programs with less headaches. Probably not the best/ optimal solution but does get the job done. I have some really "scary cmake" code if you are interested (optimized for the Qt Libraries)..

_________________________________________________________
Mike Jackson                  [email protected]
BlueQuartz Software                    www.bluequartz.net
Principal Software Engineer                  Dayton, Ohio



On Jul 26, 2009, at 4:08 AM, Dominik Szczerba wrote:

Many thanks for a very detail and equally helpful explanation. Strictly
speaking it does not exactly do what I wanted to achieve (run binaries
in place with correctly linked dll's) but greatly simplifies the
procedure of copying the runtime files to one folder (without it VS just
scatters the files in million separate sub-folders). I will also look
into delayed loading.
many thanks and regards,
Dominik

On Sat, 2009-07-25 at 23:21 -0400, Philip Lowman wrote:
On Sat, Jul 25, 2009 at 6:53 PM, Dominik Szczerba
<[email protected]> wrote:
       When debugging a MSVC target I get a complaint about missing
       DLL's. Of
       course if I 1) copy all required DLL's to the system folder,
       or 2) copy
       the exe along with all the DLL's to one separate folder - all
       works. But
       it's an obvious hassle. How can I run my executables in-place
       like on
       linux where the lib paths are known (thanks to the linker
       flags)? Have I
       forgotten anything in the cmake input?

The commands below will cause all of your generated DLLs & EXEs to be
dumped into a single folder called "bin" in your toplevel directory
unless you're using VS in which case by default it will be bin/ Debug/*
or bin/Release/* etc.  Import libraries static or shared will get
dumped in a "lib" folder.  If you're using CMake with a WIN32 project
that creates DLLs, you pretty much have to set these variables IMHO
for things to be usable.

set(CMAKE_RUNTIME_OUTPUT_
DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BIINARY_DIR}/bin)

See...
http://www.cmake.org/cmake/help/ cmake2.6docs.html#prop_tgt:RUNTIME_OUTPUT_DIRECTORY http://www.cmake.org/cmake/help/ cmake2.6docs.html#prop_tgt:ARCHIVE_OUTPUT_DIRECTORY http://www.cmake.org/cmake/help/ cmake2.6docs.html#prop_tgt:LIBRARY_OUTPUT_DIRECTORY

===

Also as an aside in case you haven't come across it yet, I highly
recommend a tool called Dependency Walker for investigating DLL
dependencies.

===

To answer your other question, one technique you can use is called
Delay Loaded DLLs (/DELAYLOAD).  I have used it before on a limited
basis with some success although it is a bit finicky to setup error
handling for it.  It can be made to work if you know exactly where a
DLL is on the hard drive/drives but that is generally a guess at best
so you might not be able to rely on it.  It might be worth a look
though.

I think generally people use the "copy all DLLs to one folder"
approach unless you're dealing with a well maintained system provided
shared library like DirectX.  One of the downsides to Windows & DLL
hell :(




--
Philip Lowman

_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to