[CMake] CMAKE_RUNTIME_OUTPUT_DIRECTORY best practice for Windows and Visual Studio
Niels Dekker - address until 2014
niels_dekker_address_until_2014 at xs4all.nl
Sun Nov 13 14:51:53 EST 2011
Mateusz Loskot wrote:
> I have a CMake-based project which builds several shared libraries and
> executables.
> There are various run-time dependencies between those shared libraries
> and executables.
>
> On Windows, I use Visual Studio for development, so I have
> CMake-generated .sln with projects. loaded into the IDE. I build.
> Then, I'd like to run one
> of executables
> (e.g. test.exe) which links against the DLLs also built by the
> project. Obviously, it is necessary to deal with the run-time search
> path.
>
> At the moment, I simplify things by outputting all .exe and .dll
> binaries to common directory, so programs can find required DLLs:
>
> set(MYPRJOUTDIR ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
> set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${MYPRJOUTDIR})
>
> This is also required to launch such executables under debugger.
> However, I have heard opinions it is some kind of a hack unnatural to
> CMake.
>
> On Linux, I do the same, but I imagine I could make use of rpath [1]
> as CMake provides some degree of support in this area [2].
>
> On Windows, there is no such concept as rpath. Isolated Applications
> [3]
> seems to be the closest idea available there.
>
> Is it a good idea to have all-in-one CMAKE_RUNTIME_OUTPUT_DIRECTORY?
> Is there any CMake best practice for dealing with run-time search path
> on Windows?
> For example, automatically setting PATH in project
> -> Configuration Properties -> Debugging -> Environment.
>
>
> [1] http://en.wikipedia.org/wiki/Rpath
> [2] http://www.vtk.org/Wiki/CMake_RPATH_handling
> [3] http://msdn.microsoft.com/en-us/library/aa375190%28VS.85%29.aspx
On Windows, it looks fine to me to have all the DLL's built by the project
together with the executable that links against them, in one and the same
CMAKE_RUNTIME_OUTPUT_DIRECTORY. The alternative of setting the PATH looks
less reliable to me, because the PATH may easily be overruled by other
locations (current directory, system directory or Windows directory),
depending on that rather complicated "Dynamic-Link Library Search Order"
thing, http://msdn.microsoft.com/en-us/site/ms682586 And eventually I guess
you don't want your application to depend on the PATH at the end user
machine. However, I haven't yet tried to build an "isolated application"
according to your reference [3]
(http://msdn.microsoft.com/en-us/library/aa375190%28VS.85%29.aspx). Would
you recommend doing so?
Kind regards, Niels
--
Niels Dekker
http://www.xs4all.nl/~nd/dekkerware
Scientific programmer at LKEB, Leiden University Medical Center
More information about the CMake
mailing list