[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