[CMake] Question about transitive dependencies

Bill Hoffman bill.hoffman at kitware.com
Thu Dec 4 17:20:17 EST 2008


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.

-Bill



More information about the CMake mailing list