[CMake] MSVC7.1 static link question

Brad King brad.king at kitware.com
Tue Feb 10 13:01:42 EST 2009


Luigi Calori wrote:
> Bill Hoffman ha scritto:
>> Philip Lowman wrote:
>>> On Mon, Feb 9, 2009 at 12:39 PM, Luigi Calori <l.calori at cineca.it 
>>> <mailto:l.calori at cineca.it>> wrote:
>>>
>>>     I' m quite a newbie in static linking, I would like to combine 
>>> two lib
>>>     into one:
>>>     say libtiff needs libjpeg and zlib
>>>     If you generate them separately, then when you build an 
>>> executable that
>>>     needs libtiff, you have to link also libjpeg and zlib otherwise 
>>> unref
>>>     happens
>>>     It is possible, under VisualStudio interface, to specify 
>>> libjpeg.lib and
>>>     zlib.lib as Additional Dependencies
>>>     This way (even if the linker show warnings as duplicate symbols) I
>>>     obtain a libtiff that can be used alone.
>>>     My question is: can I obtain the same result with cmake?
>>>     I' ve tried to use TARGET_LINK_LIBRARIES, that is perfecly 
>>> working for
>>>     exe and SHARED linkage but no success: the
>>>     vs project has always the Additional Dependencies field empty.
>>>
>>>     Am I completely missing something?
>>>
>> CMake does not work that way since it is not achievable cross 
>> platform.  If you project is CMake based CMake will chain the 
>> libraries.  If you use other build tools then you will have to 
>> explicitly list libjpeg and zlib with the libtiff.  To do this in 
>> CMake you have two options:
>>
>> 1. have a library that uses libtiff
>> add_library(mylib ...)
>> target_link_libraries(mylib libtiff libjepg zlib)
>> add_executable(myexe ...)
>> target_link_libraries(myexe mylib)  # will link in tiff jpeg and zlib
>>
>> 2. create an imported target for libtiff
>> add_library(libtiff IMPORTED)
>> set_target_properties(libtiff PROPERTIES IMPORTED_LOCATION 
>> /path/to/libtiff.lib)
>> target_link_libraries(libtiff libjpeg zlib)
>> add_executable(myexe ...)
>> target_link_libraries(myexe libtiff) # will link jpeg and zlib
>>
>>
>> -Bill
>>
>>
>>
> Hi Philip and Bill:
> 
> I tried Philip suggestion and it seem working: it adds the flags as 
> Additiona Optins in the commandline form and it seems to produce a
> libtiff.lib that links ok.
> The problem is that STATIC_LIBRARY_FLAGS property is not differentiated 
> between Debug / Release.
> 
> Bill, is your method equivalent?
> 
> Is your suggestion applicable if the  exe and the lib stay in two 
> completely different projects?
> 
> What I mean is that I ' m willing to have a CMake project that BUILDS 
> and install libtiff.lib (static)
> 
> Then I have another project that build a .dll (or .exe, I think it 
> behave the same) that Find and use my libtiff.lib.
> 
> Both your suggested method  seem to assume that myexe and libtiff are 
> built at the same time.
> This is not my case, I would like build libtiff static on win32 in such 
> a way that allow other projects (built with cmake) to link it without 
> adding explicitly the other dependent libraries.
> so to not require changes in the dependent project (it is actually 
> OpenSceneGraph, Philip)
> So either modifying VS project or adding STATIC_LIBRARY_FLAGS I  am able 
> to do.
> 
> I tried to use IMPORTED bud it did not worked

Bill's example will not work as written.  The target_link_libraries command
does not work for imported targets.  See IMPORTED target and general
packaging documentation here:

   http://www.cmake.org/Wiki/CMake_2.6_Notes#Exporting_and_Importing_Targets
   http://www.cmake.org/Wiki/CMake_2.6_Notes#Packages

CMake 2.6 makes it easy to export targets from one project (either its
build tree or install tree) for use by another project.

-Brad


More information about the CMake mailing list