In foo/CMakeLists.txt
, based on this and this, I have the following
SET (EXTERNAL_LIB_ROOT "../../external_libs/")
ADD_LIBRARY (avcodec-debug STATIC IMPORTED)
SET_PROPERTY (
TARGET avcodec-debug PROPERTY IMPORTED_LOCATION
${EXTERNAL_LIB_ROOT}/libavcodec-0.8.10.a)
In bar/CMakeLists.txt
I have this:
# old way uses system libraries
#TARGET_LINK_LIBRARIES (bar avformat avcodec avutil)
# new way uses local debug builds
TARGET_LINK_LIBRARIES (bar avformat avcodec-debug avutil)
When I run make
I get
/usr/bin/ld: cannot find -lavcodec-debug
If I revert to the old way, build, touch foo/CMakeLists.txt
and rebuild, CMake's configuration output indicates that avcodec-debug is being found by the build system.
So why can't I add it as a dependency?
Imported targets do not follow the same visibility rules as non-imported targets. While non-imported targets are global (visible and accessible from anywhere after they're defined), imported targets are only visible in the
CMakeLists.txt
where they are defined and below (in directories added byadd_subdirectory()
in this defining CMakeList).Since
foo
is a sibling ofbar
in your case, the target nameavcodec-debug
is not visible insidebar/CMakeLists.txt
, so it's treated as a normal library name.It's generally preferred to define imported targets in files you include rather than in their own projects. So change (or extract the relevant parts of)
foo/CMakeLists.txt
intofoo/avcodec.cmake
and then in the top-level CMakeList, replacewith
As it mentioned above by Angew the visibility for imported library differs, though you can extend it using GLOBAL modifier. It might be enough for you to modify add_library call next way
ADD_LIBRARY(avcodec-debug STATIC IMPORTED GLOBAL)