как связать библиотеки в vcpkg с моей библиотекой с помощью cmake?

Недавно я пытаюсь использовать cmake и vcpkg для написания проекта в vs2019.

Я хочу связать динамическую библиотеку в vcpkg со своей собственной динамической библиотекой, но столкнулся с некоторыми проблемами.

Надеюсь, кто-нибудь поможет мне исправить ошибку.

Моя структура проекта:

project
-engine
 -Engine.h
 -Engine.cpp
 -Window.h
 -Window.cpp
 -InstanceManager.h
 -InstanceManager.cpp
 -MouseListener.h
 -MouseListener.cpp
 -KeyboardListener.h
 -KeyboardListener.cpp
-main.cpp
-CMakeLists.txt

CMakeLists.txt:

cmake_minimum_required (VERSION 3.8)

project ("mario")

include_directories("./engine")

find_package(GLEW REQUIRED)
find_package(glfw3 CONFIG REQUIRED)

add_executable (mario main.cpp)

add_library(engine SHARED
"engine/Engine.h" "engine/Engine.cpp" 
"engine/Window.h" "engine/Window.cpp"
"engine/InstanceManager.h" "engine/InstanceManager.cpp" 
"engine/MouseListener.h" "engine/MouseListener.cpp" 
"engine/KeyboardListener.h" "engine/KeyboardListener.cpp")

target_link_libraries(engine PRIVATE GLEW::GLEW)
target_link_libraries(engine PRIVATE glfw)

target_link_libraries(mario PRIVATE engine)

Он показывает, что C1083 не может открыть включаемый файл «gl / glew.h»: такого файла или каталога нет. Однако когда я пишу это:

cmake_minimum_required (VERSION 3.8)

project ("mario")

include_directories("./engine")

find_package(GLEW REQUIRED)
find_package(glfw3 CONFIG REQUIRED)

add_executable (mario main.cpp
"engine/Engine.h" "engine/Engine.cpp" 
"engine/Window.h" "engine/Window.cpp"
"engine/InstanceManager.h" "engine/InstanceManager.cpp" 
"engine/MouseListener.h" "engine/MouseListener.cpp" 
"engine/KeyboardListener.h" "engine/KeyboardListener.cpp")

target_link_libraries(mario PRIVATE GLEW::GLEW)
target_link_libraries(mario PRIVATE glfw)

Работает нормально.

Это ошибка или я ошибся?


person laosai_s    schedule 12.01.2021    source источник
comment
это принадлежит codereview   -  person John D    schedule 13.01.2021


Ответы (2)


cmake_minimum_required (VERSION 3.8)

project ("mario")

include_directories("./engine")

set(CXX_STANDARD 11)

find_package(GLEW REQUIRED)
find_package(glfw3 CONFIG REQUIRED)

add_library(engine SHARED
"engine/Engine.h" "engine/Engine.cpp" 
"engine/Window.h" "engine/Window.cpp"
"engine/InstanceManager.h" "engine/InstanceManager.cpp" 
"engine/MouseListener.h" "engine/MouseListener.cpp" 
"engine/KeyboardListener.h" "engine/KeyboardListener.cpp")
target_link_libraries(engine PRIVATE GLEW::GLEW)
target_link_libraries(engine PRIVATE glfw)

add_executable (mario main.cpp)
target_link_libraries(mario PRIVATE GLEW::GLEW)
target_link_libraries(mario PRIVATE glfw)
target_link_libraries(mario PRIVATE engine)

исполняемый файл также должен ссылаться на библиотеки в vcpkg.

person laosai_s    schedule 12.01.2021
comment
если ваши общедоступные заголовки в движке включают glew или glfw, тогда вы должны сделать эту зависимость общедоступной, то есть target_link_libraries(engine PUBLIC GLEW::GLEW), и если main не включает напрямую, они не должны напрямую target_link в mario, но использовать транзитивность ... - person Mizux; 12.01.2021

target_link_libraries(engine PRIVATE GLEW::GLEW)
target_link_libraries(engine PRIVATE glfw)

не правы!

должен быть:

target_link_libraries(engine PUBLIC GLEW::GLEW)
target_link_libraries(engine PUBLIC glfw)
person laosai_s    schedule 13.01.2021