【问题标题】:how to link libraries in vcpkg to my library using cmake?如何使用 cmake 将 vcpkg 中的库链接到我的库?
【发布时间】:2021-04-17 00:32:26
【问题描述】:

我最近在尝试用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)

效果很好。

这是一个错误还是我犯了错误?

【问题讨论】:

  • 这属于codereview

标签: c++ c visual-studio cmake vcpkg


【解决方案1】:
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 中的库。

【讨论】:

  • 如果引擎中的“公共”标头确实包含 glew 或 glfw,那么您必须将此依赖项公开,即 target_link_libraries(engine PUBLIC GLEW::GLEW),如果 main 不直接包含它们,则不要直接在 mario 中将 target_link 指向它,而是使用传递性...
【解决方案2】:
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)

【讨论】: