I have a project that uses Vcpkg to import third-party dependencies. I am building on Windows. This project has the following <my_target>-config.cmake:
include(CMakeFindDependencyMacro)
# Put dependencies here
#find_dependency(Eigen3)
find_package(Eigen3 3.4 CONFIG REQUIRED NO_MODULE)
include(${CMAKE_CURRENT_LIST_DIR}/<my_target>-targets.cmake)
When I try to consume this target via find_package(<my_target>) from another CMake project, I get the following error:
CMake Error at path/to/<my_target>-config.cmake:9 (find_package):
Could not find a package configuration file provided by "Eigen3" (requested
version 3.4) with any of the following names:
Eigen3Config.cmake
eigen3-config.cmake
Add the installation prefix of "Eigen3" to CMAKE_PREFIX_PATH or set
"Eigen3_DIR" to a directory containing one of the above files. If "Eigen3"
provides a separate development package or SDK, be sure it has been
installed.
Call Stack (most recent call first):
CMakeLists.txt:43 (find_package)
-- Configuring incomplete, errors occurred!
Clearly, trying to grab Eigen via a find_package call in <my_target>-config.cmake doesn't do the trick. This isn't surprising, since the consumer project does not use vcpkg as part of its toolchain.
My next attempt was to add the following to the install stage of <my_target>:
install(IMPORTED_RUNTIME_ARTIFACTS Eigen3::Eigen
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
This doesn't work, as I get:
install IMPORTED_RUNTIME_ARTIFACTS given target "Eigen3::Eigen" which is
not an executable, library, or module. C:\path/to/my/CMakeLists.txt
Indeed, I scoured my build directory, and couldn't actually find where the Eigen3::Eigen target gets built. I'm not sure what to make of this, but <my_target> can find and link with Eigen, no problem:
find_package(Eigen3 3.4 CONFIG REQUIRED NO_MODULE)
if (NOT Eigen3_FOUND)
message(FATAL_ERROR "Cannot find Eigen!")
else()
message(STATUS "Found Eigen")
message(STATUS "Eigen imported location: ${EIGEN3_ROOT_DIR}")
endif()
So, I tried the following:
install(
FILES $<TARGET_FILE:Eigen3::Eigen>
DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
But this gave me a similar error about the Eigen3::Eigen target not being found. Am I doing something silly? Without a target to even manually copy into my install directory, I have no clue how to supply Eigen, or any of my other third party dependencies, to consumers of my library.
So, the obvious answer here is that Eigen is a header-only library, and therefore has no target. I was confused because previously I'd been linking to the
Eigen::Eigen3target, but this was the same as just adding the proper include directories.Installing the
Eigenheaders to the correct directory usinginstall(DIRECTORY ...)solves my problem, andfind_packageworks just fine now.