[CMake] dll not found in test app for library within visual studio solution (Windows)

David Cole david.cole at kitware.com
Mon Jun 25 15:17:56 EDT 2012


On Mon, Jun 25, 2012 at 2:38 PM, Benjamin Kurz
<benjamin.kurz at bioskill.com> wrote:
> Hi Petr,
>
> thanks for the help.
> Sure, setting the PATH is an option. I will also try the RUNTIME_OUTPUT_DIRECTORY.
>
> But I'm still wondering why Visual Studio does not pick up the dll at runtime.
> Is the option "link_directories" and the resulting "additional lib path" in Visual Studio only for the actual linking, and does not effect the runtime lookup of dlls?
> If so, it of course makes sense, that it's not found. Simply from the name, I assumed that it would work for the runtime also.

Yes, it's only a build-time setting. It's where the linker will look
for libraries that are not specified by full path. You should avoid
using the link_directories command, and instead pass the full path of
libraries to the target_link_libraries command.

The present  documentation for link_directories says "Note that this
command is rarely necessary"

  http://cmake.org/cmake/help/v2.8.8/cmake.html#command:link_directories


HTH,
David


>
> Benjamin
>
>
> Am 25.06.2012 um 18:15 schrieb Petr Kmoch:
>
>> Hi Benjamin.
>>
>> What you're dealing with is the runtime not finding the DLL, and cmake
>> has little control over that. One solution would be to set both
>> library and the executable to build in the same directory (using
>> set_property(TARGET trgt PROPERTY RUNTIME_OUTPUT_DIRECTORY whatever).
>>
>> Two other solutions exist, both VS-specific Open the executable's
>> Property dialog and go to the Debugging page. There, you can either:
>> 1) set working directory to that where the library is built
>> or
>> 2) modify the PATH for the executable, like this:
>> PATH=path_to_library;$(PATH)
>> (entered into the Environment field). Also make sure Merge Environment is Yes.
>>
>> Petr
>>
>> On Mon, Jun 25, 2012 at 5:48 PM, Benjamin Kurz
>> <benjamin.kurz at bioskill.com> wrote:
>>> Hi there,
>>>
>>> I have a small project setup, it contains one library and one small test
>>> application, that should use the library. Basically very similar to the
>>> basic example on the cmake website.
>>>
>>> the structure is still pretty easy:
>>> Project (called ProjectBridge)
>>>  |
>>>  |-- Library (called Bridge)
>>>  |
>>>  |-- testApp
>>>
>>>
>>> I have 3 CMakeLists.txt one in the root directory, one in the Library
>>> directory, and one in the TestApp. I add them at the end of this mail.
>>> Now I create a Visual Studio solution with cmake and build the project. It
>>> builds fine. But if I want to run the TestApp it cannot find the dll of the
>>> Library. Of couse it works if I copy the dll by hand into the
>>> TestApp/Release folder, but I want it to work out of the box, without the
>>> "install" project necessary to run first too (where I could easily copy the
>>> dll to the appropriate place).
>>>
>>> Although the project settings of visual studio of the TestApp project,
>>> "additional libary paths" contains "...<build_directory_of_project>/Bridge"
>>> and "...<build_directory_of_project>/Bridge/$(Configuration)", it does not
>>> find the Bridge.dll.
>>>
>>> The responsible line for this is in TestApp/CMakeLists.txt. At least I
>>> assume it is.
>>> "link_directories (${ProjectBridge_BINARY_DIR}/Bridge)"
>>>
>>> If wanted or necessary, I can also easily make a project package and attach
>>> it.
>>>
>>> Thanks for any help.
>>>
>>> Best regards
>>> Benjamin
>>>
>>> System: Win7 64-bit, CMake 2.8.8, Visual Studio 2010 Express
>>>
>>> ######################
>>> CMakeLists.txt (Project)
>>> ######################
>>> cmake_minimum_required (VERSION 2.8)
>>> project (ProjectBridge)
>>>
>>> add_subdirectory (Bridge)
>>> add_subdirectory (TestApp)
>>>
>>> #####################
>>> CMakeLists.txt(testApp)
>>> #####################
>>> include_directories (${ProjectBridge_SOURCE_DIR}/Bridge)
>>> include_directories (${CMAKE_INSTALL_PREFIX}/include)
>>>
>>> link_directories (${ProjectBridge_BINARY_DIR}/Bridge)
>>> link_directories (${CMAKE_INSTALL_PREFIX}/bin)
>>>
>>> add_executable (testApp main.cpp)
>>>
>>> target_link_libraries (testApp Bridge)
>>>
>>> #####################
>>> CMakeLists.txt(Bridge)
>>> #####################
>>> cmake_minimum_required (VERSION 2.8)
>>> project (Bridge)
>>>
>>> IF(MSVC_VERSION EQUAL 1400 OR MSVC_VERSION GREATER 1400)
>>>  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
>>> -D_CRT_SECURE_NO_WARNINGS)
>>>  ADD_DEFINITIONS(-D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS)
>>> ENDIF(MSVC_VERSION EQUAL 1400 OR MSVC_VERSION GREATER 1400)
>>>
>>> SET( Bridge_MAJOR_VERSION 0 )
>>> SET( Bridge_MINOR_VERSION 1 )
>>> SET( Bridge_BUILD_VERSION 1 )
>>>
>>> SET( Bridge_FULL_VERSION
>>> ${Bridge_MAJOR_VERSION}.${Bridge_MINOR_VERSION}.${Bridge_BUILD_VERSION} )
>>>
>>>
>>> FILE( GLOB Bridge_HDRS RELATIVE ${Bridge_SOURCE_DIR} *.h )
>>> set(Bridge_HDRS "${Bridge_HDRS}")
>>>
>>> FILE( GLOB Bridge_SRCS RELATIVE ${Bridge_SOURCE_DIR} *.cpp )
>>> set(Bridge_SRCS "${Bridge_SRCS}")
>>>
>>> include (GenerateExportHeader)
>>>
>>> FOREACH( src ${Bridge_SRCS} )
>>>  LIST( APPEND Bridge_SRCS_global ${CMAKE_CURRENT_SOURCE_DIR}/${src} )
>>> ENDFOREACH( src )
>>>
>>> FOREACH( incl ${Bridge_HDRS} )
>>>  LIST( APPEND Bridge_HDRS_global ${CMAKE_CURRENT_SOURCE_DIR}/${incl} )
>>> ENDFOREACH( incl )
>>>
>>> SET(CMAKE_INSTALL_PREFIX "install" CACHE PATH "Bridge install prefix")
>>>
>>> # make sure symbols are exported.
>>> IF (WIN32)
>>> SET( Bridge_COMPILE_FLAGS "-DBRIDGE_EXPORTS" )
>>> ENDIF (WIN32)
>>>
>>> INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} )
>>> INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )
>>>
>>> add_compiler_export_flags()
>>>
>>> # Create build files.
>>> ADD_LIBRARY(Bridge SHARED
>>>                ${Bridge_SRCS_global}
>>>                ${Bridge_HDRS_global} ${PROJECT_BINARY_DIR}/Bridge_export.h)
>>>
>>> TARGET_LINK_LIBRARIES( Bridge ${requiredLibs} ${optionalLibs} )
>>>
>>> GENERATE_EXPORT_HEADER(Bridge
>>>            BASE_NAME Bridge
>>>            EXPORT_MACRO_NAME BRIDGE_EXPORT
>>>            EXPORT_FILE_NAME Bridge_export.h
>>>            STATIC_DEFINE Bridge_BUILT_AS_STATIC
>>> )
>>>
>>> install(FILES Bridge.h ${PROJECT_BINARY_DIR}/Bridge_export.h DESTINATION
>>> ${CMAKE_INSTALL_PREFIX}/include  )
>>>
>>> INSTALL( TARGETS Bridge
>>>         LIBRARY DESTINATION lib
>>>         RUNTIME DESTINATION bin
>>>         ARCHIVE DESTINATION lib )
>>>
>>>
>>>
>>>
>>> --
>>>
>>> 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


More information about the CMake mailing list