In the cmake 3.28.3, when I give library ( example here is libdl.so.2) , in the add_dependencies, its throwing an error: The dependency target “dl” of target “xxxx” does not exist.
add_dependencies(xxxx zzzz dl)
The dl library is there in the system: libc6:amd64: /usr/lib/x86_64-linux-gnu/libdl.so.2
Thanks for your reply. There is already one target_link_libraries(xxxx glog gflags yyyy …) there, and when modified as per your advice,
target_link_libraries(xxxx glog gflags yyyy zzzz, dl)
its throwing the following error:
Target “zzzz” of type UTILITY may not be linked into another target. One
may link only to INTERFACE, OBJECT, STATIC or SHARED libraries, or to
executables with the ENABLE_EXPORTS property set.
I tried with separate target_link_libraries(xxxx zzzz, dl)
as well. Its throwing the same error
Any idea how to fix on this? This error is not coming when I use add_dependencies, but previous error is coming as I mentioned in my last mail.
libdl.so.2 is a library on disk, external to your project.
zzzz is a custom target in your project (created by add_custom_target()).
You need your target xxxx to consume both.
add_dependencies() only accepts CMake targets as arguments, and introduces dependencies, but does not cause linking. target_link_libraries() accepts both targets and libraries, and causes them to be linked.
To link the library, use target_link_libraries(). To depend on a custom target (since these cannot be linked, they don’t correspond to anything linkable), use add_dependencies(). Put together:
add_dependencies(xxxx dl) does not work on cmake 3.28.3 as I am seeing the same error. Probably this could not find the libdl.so file.
The dependency target “dl” of target “xxxx” does not exist.
I added the following changes and its not throwing any error. Are these changes are fine or do we have any alternative way to fix this issue.
find_library(DL libdl.so)
add_custom_target(custom_dl ${DL})
add_dependencies(xxxx custom_dl)
here add_custom_target is compulsory or any other way we can do it?
Thank you for an update. This is what I understood from your explanation. All installed libraries in the OS (like dl, gflags,… ) has to included using the target_link_libraries. And all the cmake generated targets need to be added using add_dependencies.
There is one more Question. If my target depends on the header file (x.h), how can I add that.
add_executible(xxxx < set of source files >)
target_link_libraries(xxxx yyyy zzzz)
add_dependencies(xxxx x.h)
This code snippet throwing the same error: The dependency target “x.h” of target “xxxx” does not
exist.
Note: this was working fine with 3.16.3 and seeing issues with 3.28.