Как исправить неопределенную ссылку на символ 'dlclose@@GLIBC_2.2.5' от glad.c

Я изучаю Opengl, следуя инструкциям на https://learnopengl.com/ и у меня возникают проблемы с установкой зависимости с помощью cmake( см. Создание окна).

Я основал свой CMakeLists.txt на документации GLFW.

cmake_minimum_required(VERSION 3.14)
project(openglTuto)


include_directories(include)
add_executable(gltuto src/main.c src/glad.c)

find_package(glfw3 3.3 REQUIRED)
find_package(OpenGL REQUIRED)

target_link_libraries(gltuto glfw)
target_include_directories(gltuto PUBLIC ${OPENGL_INCLUDE_DIR})
target_link_libraries(gltuto ${OPENGL_gl_LIBRARY})

CMake удалось построить мою конфигурацию, но ниндзя не удалось скомпилировать и вывести ошибку.

[1/1] Linking C исполняемый файл gltuto

СБОЙ: gltuto: && /usr/bin/cc CMakeFiles/gltuto.dir/src/main.co CMakeFiles/gltuto.dir/src/glad.co -o gltuto /usr/lib/libglfw.so.3.3 &&:

/ usr / bin / ld: CMakeFiles / gltuto.dir / src / glad.co: неопределенная ссылка на символ 'dlclose @@ GLIBC_2.2.5'

/ usr / bin / ld: /usr/lib/libdl.so.2: ошибка при добавлении символов: DSO отсутствует в командной строке

collect2: error: ld вернул 1 состояние выхода

ниндзя: сборка остановлена: подкоманда не выполнена.

1 ответ

Решение

Линкер жалуется, что не нашел dlclose, Можете добавить libdl с CMAKE_DL_LIBS. Кроме того, используйте современную связь с целями вместо строк.

Измените ваш CMakeLists.txt на:

cmake_minimum_required(VERSION 3.14)
project(openglTuto)


add_executable(gltuto src/main.c src/glad.c)

find_package(glfw3 3.3 REQUIRED)
find_package(OpenGL REQUIRED)

target_include_directories(gltuto PUBLIC
                           $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
                           $<INSTALL_INTERFACE:include>)
target_link_libraries(gltuto PUBLIC glfw OpenGL::GL ${CMAKE_DL_LIBS})

Посмотрите выражения генератора, чтобы понять BUILD_INTERFACE а также INSTALL_INTERFACE,

Другие вопросы по тегам