Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 22016

CMake library linking order

$
0
0

I have following libraries lib_A, lib_B, lib_C, lib_D. I am doing something like this in my CMake files (order is important):

  1. ADD_LIBRARY(lib_A)
  2. ADD_LIBRARY(lib_B)
  3. ADD_LIBRARY(lib_C)
  4. ADD_LIBRARY(lib_D)
  5. TARGET_LINK_LIBRARIES(lib_B lib_C)
  6. TARGET_LINK_LIBRARIES(lib_A lib_B)
  7. ADD_EXECUTABLE(Exec)
  8. TARGET_LINK_LIBRARIES(exec lib_A)
  9. TARGET_LINK_LIBRARIES(exec lib_D)

This results in following linker command.

linker -llib_A -llib_D -llib_B -llib_C

Q1. Why are lib_B and lib_C after lib_D?

Q2. When I change CMake a little bit and do something like this:

  1. TARGET_LINK_LIBRARIES(lib_A lib_D)
  2. TARGET_LINK_LIBRARIES(exec lib_A)

then linking order is like this:

linker -llib_A -llib_B -llib_C -llib_D

Here, lib_B and lib_C are before lib_D. It means that target_link_libraries works differently for executable targets and library targets. Am I right?

The problem here is that lib_B and lib_C also depend on lib_D, but I don't want to make target_link_libraries(lib_B lib_D) and target_link_libraries(lib_C lib_D), because I have more of such cases, and I would have to do it manually for each library. Of course doing like in Q2 solves the problem but:

Q3 - Is this order guaranteed somehow by CMake or it is just a fortuity?

Thank you


Viewing all articles
Browse latest Browse all 22016

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>