Jump to content

  • Log In with Google      Sign In   
  • Create Account





Solving the automated copy C++ Runtime issue

Posted by blewisjr, 10 November 2013 · 328 views

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.txt
project(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 files
set(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 files
set(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 files
add_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 files
add_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})





October 2014 »

S M T W T F S
   1234
567891011
12131415161718
19202122232425
26272829 30 31 

Recent Comments

Recent Comments

PARTNERS