связанная библиотека действительна в CMakeLists, но не связывается во время компиляции

#c #linux #cmake #glfw

#c #linux #cmake #glfw

Вопрос:

Я только начинаю возиться с vulkan и GLFW, но когда я пытаюсь скомпилировать тестовую программу, она выдает мне кучу ошибок компоновщика:

 /usr/bin/ld: CMakeFiles/vulkan_test.dir/loops.cpp.o: in function `Loops::Init()':
loops.cpp:(.text 0xd): undefined reference to `glfwInit'
/usr/bin/ld: loops.cpp:(.text 0x1c): undefined reference to `glfwWindowHint'
/usr/bin/ld: loops.cpp:(.text 0x2b): undefined reference to `glfwWindowHint'
/usr/bin/ld: loops.cpp:(.text 0x4f): undefined reference to `glfwCreateWindow'
/usr/bin/ld: CMakeFiles/vulkan_test.dir/loops.cpp.o: in function `Loops::Update()':
loops.cpp:(.text 0xa3): undefined reference to `glfwPollEvents'
/usr/bin/ld: CMakeFiles/vulkan_test.dir/loops.cpp.o: in function `Loops::DeInit()':
loops.cpp:(.text 0xcd): undefined reference to `glfwDestroyWindow'
/usr/bin/ld: loops.cpp:(.text 0xd2): undefined reference to `glfwTerminate'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/vulkan_test.dir/build.make:113: vulkan_test] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/vulkan_test.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
 

Это мой CMakeLists.txt:

 cmake_minimum_required(VERSION 3.22)
project(vulkan_test)
set(CMAKE_CXX_STANDARD 17)

set(CMAKE_MODULE_PATH /home/headass/CMake_Modules/)

find_package(GLFW REQUIRED)
find_package(Vulkan REQUIRED)
include_directories(${GLFW_INCLUDE_DIRS} ${VULKAN_INCLUDE_DIRS})

add_executable(vulkan_test main.cpp loops.cpp)

target_link_libraries(vulkan_test ${GLFW_LIBRARIES} ${VULKAN_LIBRARIES})
 

Есть идеи, почему это происходит? У меня установлены vulkan и GLFW, libglfw.so они находятся в моем /usr/lib/ каталоге, и clangd не видит в этом ничего плохого, но он по-прежнему не может правильно связать.
И да, я пытался найти это в Google, но безрезультатно.

Комментарии:

1.Вы уверены, что эта переменная GLFW_LIBRARIES действительно содержит результаты find_package(GLFW) ? Согласно вашему решению с явной ссылкой против glfw , это не так. Способ извлечения результатов find_package(GLFW) определяется FindGLFW.cmake скриптом, который у вас есть в вашем каталоге /home/headass/CMake_Modules/ . Также вы можете проверить содержимое переменной с помощью simple message("GLFW_LIBRARIES: {GLFW_LIBRARIES}") .

2. Я рекомендую использовать Premake ( premake.github.io ). Это НАМНОГО лучше, чем CMake.

Ответ №1:

Изменение:

 target_link_libraries(vulkan_test ${GLFW_LIBRARIES} ${VULKAN_LIBRARIES})
 

Для:

 target_link_libraries(vulkan_test glfw ${GLFW_LIBRARIES} ${VULKAN_LIBRARIES})
 

работала безупречно