Building of executable and shared library with cmake, runtimelinker does not find dll

前端 未结 4 1337
梦毁少年i
梦毁少年i 2021-01-04 05:14

I am working with gcc(cygwin), gnu make, windows 7 and cmake.

my cmake testprojekt has the following structure

rootdir
|-- App
|   |-- app.cpp
|   +-         


        
4条回答
  •  一向
    一向 (楼主)
    2021-01-04 05:41

    I tried the option 1 from accepted answer (by pdeschain). I even created a cmake hook to register paths of linked libraries automatically

    function (xtarget_link_libraries target libs) # same as target_link_libraries but with additional improvements to allow windows find the library at runtime
    LIST(REMOVE_AT ARGV 0)
    SET(LIBS ${ARGV}) # this is to pass list into this function
    target_link_libraries(${target} ${LIBS}) # call standard routine
    
    if(WIN32)
        set(TFILE ".")
        get_property(slibs TARGET ${target} PROPERTY all_libs) # recall libs linked before
        set(LIBS ${slibs};${LIBS})
        set_property(TARGET ${target} PROPERTY all_libs ${LIBS}) # save all libs
        FOREACH(lib ${LIBS}) # compose a list of paths
            set(TFILE "${TFILE};$")
        ENDFOREACH()
        #add reg key
        add_custom_command(TARGET ${target} POST_BUILD COMMAND  reg add "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\${target}.exe" /v "Path" /d "${TFILE}" /f )
    endif()
    endfunction()
    

    Can be used as xtarget_link_libraries(test lib1 lib2). The application will be able to find dynamic libraries at their absolute paths.

    BUT, there is a big problem with this, that the App Paths mechanism https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx#appPaths

    does not allow to have different entries for say 'Debug/test.exe' and 'Release/test.exe'. So to me this is a poor option.

    You may add the following line to fill the Default key as path to the program as suggested in the post.

    add_custom_command(TARGET ${target} POST_BUILD COMMAND reg add "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\${target}.exe" /ve /d "$" /f )

    Now you can enjoy running test.exe from anywhere in the system... I guess my next try will be option

    1. Create symbolic links to dlls with cmake.

提交回复
热议问题