Search code examples
cmakebuild-dependencies

CMake rejects a second target_link_libraries talking about "keyword" vs "plain"


I'm compiling a binary, and I want to add its dependency libraries in two different target_link_libraries() commands for various reasons.

My commands look like this:

target_link_libraries(my_prog PRIVATE foo bar)
target_link_libraries(my_prog baz)

and I get the error:

  The keyword signature for target_link_libraries has already been used with
  the target "my_prog".  All uses of target_link_libraries with a target
  must be either all-keyword or all-plain.

  The uses of the keyword signature are here:

   * tests/CMakeLists.txt:10 (target_link_libraries)

What does this mean? What should I do?


Solution

  • Your use of target_link_libraries() is indeed problematic, as it involves two different "flavors" of this command, a traditional and a newer one.

    In one use, you specify the dependency is PRIVATE; in the other, you specify nothing. That's not acceptable: Either you specify PUBLIC/PRIVATE/INTERFACE for all elements, or for none.

    So, you can fix your CMakeLists.txt to say either:

    target_link_libraries(my_prog foo bar)
    target_link_libraries(my_prog baz)
    

    or

    target_link_libraries(my_prog PRIVATE foo bar)
    target_link_libraries(my_prog PRIVATE baz)