Solving the automated copy C++ Runtime issue

Published November 10, 2013
Advertisement
Hello Everyone,

In my last post I was using QTCreator with QMake to build some SFML sample code. In order to get the code to run from the ide if you remember correctly I needed to copy the SFML Runtime dll files to the directory because we were dynamically linking. I did mention that I could not run the .exe from the build directory due to missing some C++ runtime files which the .exe is linked against. This post is about finding a solution to this problem.

Initially I though I would be able to use QMake to copy the C++ runtime files for gcc, pthreads, and stdc++ to the build directory. I wanted to do this so that if I wanted I can run the code from outside the IDE directly from the Build directory. Everything was fine till I tried to copy the stdc++ dll file. After some investigation I found that QMake is using the DOS xcopy to do the copying and I feel for some reason it does not like the ++ characters in the file name. This assumption was confirmed by renaming the dll file and copying it over which worked. The issue with this is the code can't find the dll if you rename it so on to another way.

The second attempt I tried to use QMake to statically link to the stdc++ library using the -static-libstdc++ linker option. This was a total fail. This might be an issue with mingw I am not sure. So I bailed on this Idea quickly. Time to try something else...

QTCreator can also use CMake which is another Makefile generation system. CMake is awsome and I have dabbled with it in the past. I never used it to solve this problem before so I decided to give it a shot since it is supported.

The really nice thing about CMake is it's great support on multiple platforms and it can generate project files for various ide's etc... In order to solve this problem I am having I need to copy over the DLL files as a post build to the project. It took me some time to figure this out but I got success. The key here is that CMake actually provides cross platform utilities built right into it's executable. This means I can use cmake to execute a cross platform copy command to copy the dll files post build.

Here is the code to solve all the problems and it works flawlessly. By default QTCreator sets a bunch of CMake variables for us as an out of source build.

CMakeLists.txtproject(Ascended)cmake_minimum_required(VERSION 2.8)aux_source_directory(. SRC_LIST)set(SFML_ROOT ../libs/SFML-2.1)set(MINGW_ROOT c:/Qt/5.1.1/mingw48_32)find_package(SFML COMPONENTS system graphics window REQUIRED)include_directories(${SFML_INCLUDE_DIR})# SFML Runtime DLL filesset(SFML_RUNTIME_FILES ${SFML_ROOT}/bin/sfml-system-2.dll ${SFML_ROOT}/bin/sfml-graphics-2.dll ${SFML_ROOT}/bin/sfml-window-2.dll)# MINGW Runtime DLL filesset(MINGW_RUNTIME_FILES ${MINGW_ROOT}/bin/libgcc_s_dw2-1.dll ${MINGW_ROOT}/bin/libwinpthread-1.dll ${MINGW_ROOT}/bin/libstdc++-6.dll)add_executable(${PROJECT_NAME} ${SRC_LIST})# POST_BUILD notification and copy SFML Runtime DLL filesadd_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Copying SFML Runtime to Build directory.")foreach(FILE ${SFML_RUNTIME_FILES}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FILE} ${CMAKE_BINARY_DIR} )endforeach(FILE)# POST_BUILD notification and copy MinGW runtime DLL filesadd_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Copying MinGW Runtime to Build directory.")foreach(FILE ${MINGW_RUNTIME_FILES}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FILE} ${CMAKE_BINARY_DIR} )endforeach(FILE)target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES})
1 likes 0 comments

Comments

Nobody has left a comment. You can be the first!
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement