У меня есть проект, в котором используется много внешних библиотек. Я использую CMake в качестве системы сборки. В настоящее время я добавляю и связываю библиотеки следующим образом:
##### LIBRARIES ###############################################
# Try to find the library the "classic" way
find_library("DEPENDENCY_GLFW" NAMES "glfw" "glfw3")
# Try to find a package for the library
find_package(glfw3 CONFIG)
# Check if the library has been found using the "classic" way
if(DEPENDENCY_GLFW MATCHES "NOTFOUND")
# If it was not found, check if find_package found it
if(glfw3_FOUND)
# find_package found it, add target
list(APPEND "DEPENDENCIES" "glfw")
message(STATUS ">> Found dependency: GLEW")
else()
# Has not been found
message(WARNING ">> Unable to find dependency: GLFW")
endif()
else()
# Found it with the "classic" way
list(APPEND "DEPENDENCIES" "${DEPENDENCY_GLFW}")
message(STATUS ">> Found dependency: GLFW")
endif()
##### HEADERS #################################################
# Find the header path
find_path(GLFW_INCLUDE_DIRECTORY "GLFW/glfw3.h")
if(GLFW_INCLUDE_DIRECTORY MATCHES "NOTFOUND")
# Has not been found
message(WARNING ">> Unable to find dependency headers: GLFW")
else()
# Has been found, add directory to list
list(APPEND "DEPENDENCIES_HEADERS" "${GLFW_INCLUDE_DIRECTORY}")
message(STATUS ">> Found dependency headers: GLFW")
endif()
# ...
target_include_directories("mytarget" PUBLIC "${DEPENDENCIES_HEADERS}")
target_link_libraries("mytarget" PUBLIC "${DEPENDENCIES}")
Хотя это работает, я почти уверен, что есть лучший способ сделать это sh. Код должен быть как можно более кроссплатформенным, что означает, что вы должны иметь возможность связываться с пакетами CMake, предоставляемыми vcpkg
(например, Windows) или только библиотеками (например, Linux).