[CMake] Question about transitive dependencies

Robert Dailey rcdailey at gmail.com
Thu Dec 4 17:33:00 EST 2008


On Thu, Dec 4, 2008 at 4:20 PM, Bill Hoffman <bill.hoffman at kitware.com>wrote:

> Robert Dailey wrote:
>
>  On Thu, Dec 4, 2008 at 4:06 PM, Alexander Neundorf <
>> a.neundorf-work at gmx.net <mailto:a.neundorf-work at gmx.net>> wrote:
>>
>>    But, if you do in cmake:
>>    target_link_libraries(staticLibB staticLibA)
>>    this will not really link (as it would for a shared lib), but it will
>>    nevertheless keep track of the dependencies.
>>    So when liking
>>    target_link_libraries(myApp staticLibB)
>>    cmake knows that it has to add staticLibA to the linker command.
>>
>>
>> But that's one of the things that really bothers me. This is that
>> redundancy I was talking about earlier. If I do:
>>
>> add_dependencies( C B )
>> target_link_libraries( C staticLibB )
>>
>> It's a bit pointless. For example, CMake should be smart enough to know
>> that by adding a dependency to B, it should look at the library that it is
>> outputting (In this case, staticLibB.lib) and add that to an implicit call
>> to target_link_libraries(). I only want to use target_link_libraries() to
>> link against external third party libraries that aren't explicitly
>> represented as a project in my CMake build process.
>>
>> If I decide to change the output name for the static library B outputs,
>> I'm forced to then revisit all of the target_link_libraries() calls and
>> rename staticLibB. This is a management issue (amongst other things).
>>
>>
>>  You are missing something.  The output name has nothing to do with the
> name used in target_link_libraries.  add_dependencies has nothing to do with
> linking.   It adds an artificial depend between two targets to make sure one
> is built before the other one for whatever reason needed.   If you want to
> link something, you should use target_link_libraries.  For arguments to
> target_link_libraries you should use the name of the target.
>
>
> add_library(A ...)
> add_library(B ...)
> target_link_libraries(B A)
> add_executable(C ...)
> target_link_libraries(C B)
>
> The above will link C to B and A.   The output names of B and A will be
> correctly used when linking C.


In your sample code above, I noticed you didn't use add_dependencies(). Does
target_link_libraries() guarantee build order when targets are specified
instead of libraries?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20081204/9a481590/attachment.htm>


More information about the CMake mailing list