On 03/22/2011 03:16 PM, Chris Volpe ARA/SED wrote: > I posted this question in the VTK Users mailing list originally, but have > since determined that it is more of a CMake issue than a VTK issue, and the > involvement of VTK is only tangential. > > I am trying to set up a source tree which will allow CMake to create a MSVC++ > .sln file that contains the following two projects: > > 1. A DLL (called "FeatureViewer") containing a vanilla C++ class that > links against several VTK kits (Graphics, Rendering, and Hybrid). > > 2. An EXE (called "TestDriver") that links against the aforementioned > library containing the vanilla C++ class. > > I want to deliver the DLL, LIB, and class header file from (1) above (as well > as the dependent VTK DLLs) to a co-worker who has his own application and > wants to use the functionality I'm encapsulating, but he doesn't want to > "vtk-ify" his build process. The EXE in (2) above is simply my test driver > for (1). > > My problem is that the EXE won't build because the generated project is > spuriously looking for vtk libraries (e.g. vtkGraphics.lib et. al.) at link > time that it doesn't directly reference, and it doesn't know where to find > them. The EXE shouldn't need to know about them because their use is strictly > within the FeatureViewer library. If I go into the EXE project properties and > manually delete the references to vtkGraphics.lib et. al. from the > linker->input->additional-dependencies list, it works. > > At first, I thought I was just doing something wrong in my CMakeLists.txt > files, but page 25 of the CMake User's Guide suggests that this behavior is > by design. > The example given is: > > add_library(foo foo.cxx) > target_link_libraries(foo bar) > > add_executable(foobar foobar.cxx) > target_link_libraries(foobar foo) > > The text below the example states, "This will link the libraries foo and bar > into the executable foobar even [sic], although only foo was explicitly > linked into foobar. With shared or DLL builds this linking is not always > needed, but the extra linkage is harmless." > > It seems to me that this extra linkage is not harmless: I don't want clients > of FeatureViewer to have to know about vtkGraphics.lib et. al., but CMake is > creating a spurious reference. > > Can someone provide a work-around? > > My CMakeLists.txt files look like this: > > Top Level: > CMAKE_MINIMUM_REQUIRED(VERSION 2.4) > IF(COMMAND CMAKE_POLICY) > CMAKE_POLICY(SET CMP0003 NEW) > ENDIF(COMMAND CMAKE_POLICY) > > PROJECT(FeatureViewer) > > add_subdirectory(TestDriver) > add_subdirectory(FeatureViewer) > > FeatureViewer: > SET (FeatureViewer_SRCS > FeatureViewer.cxx > ) > > IF(NOT VTK_BINARY_DIR) > FIND_PACKAGE(VTK REQUIRED) > IF(NOT VTK_USE_RENDERING) > MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.") > ENDIF(NOT VTK_USE_RENDERING) > INCLUDE(${VTK_USE_FILE}) > ENDIF(NOT VTK_BINARY_DIR) > > ADD_LIBRARY(FeatureViewer SHARED ${FeatureViewer_SRCS}) > TARGET_LINK_LIBRARIES(FeatureViewer vtkGraphics vtkRendering vtkHybrid) > > TestDriver: > ADD_EXECUTABLE(TestDriver TestDriver.cxx) > > TARGET_LINK_LIBRARIES(TestDriver FeatureViewer) > > INCLUDE_DIRECTORIES(${FeatureViewer_SOURCE_DIR}/FeatureViewer) > > Thanks in advance!! > Chris
The TARGET_LINK_LIBRARIES() command works transitively, i.e. TestDriver will be linked against each shared library that FeatureViewer is linked against, too. You might break this transitivity by explicitly setting the LINK_INTERFACE_LIBRARIES target properties of FeatureViewer to "" or, in general, to the set of libraries which are still to be linked transitively. As an alternative, you might use a second invocation TARGET_LINK_LIBRARIES(FeatureViewer TARGET_LINK_LIBRARIES ...) in FeatureViewer/CMakeLists.txt to explicitly specify the transitive libraries. Of course, the VTK ones should not appear in these lists. 'hope that helps. Regards, Michael _______________________________________________ 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