如何修复来自glad.c的未定义符号'dlclose@@GLIBC_2.2.5'的引用问题。

17

我在跟随https://learnopengl.com/上的教程学习OpenGL,但在使用cmake(请看Creating a window)时遇到了问题。

我基于GLFW文档编写了我的CMakeLists.txt文件。

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构建我的配置成功了,但是Ninja编译失败并输出错误。

[1/1] 链接 C 可执行文件 gltuto

FAILED: gltuto : && /usr/bin/cc CMakeFiles/gltuto.dir/src/main.c.o CMakeFiles/gltuto.dir/src/glad.c.o -o gltuto /usr/lib/libglfw.so.3.3 && :

/usr/bin/ld: CMakeFiles/gltuto.dir/src/glad.c.o: 对符号' dlclose@@GLIBC_2.2.5 '未定义

/usr/bin/ld: /usr/lib/libdl.so.2: 错误:缺少命令行中的DSO

collect2: error: ld returned 1 exit status

ninja: build stopped: subcommand failed.


2
“DSO missing from command line” 很明显,你需要添加 -ldl。虽然在第一次链接时传递库的绝对路径真的很奇怪。 - o11c
1个回答

38
链接器报告找不到 dlclose。你可以通过CMAKE_DL_LIBS添加libdl。 此外,使用目标而不是字符串进行现代链接。将你的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_INTERFACEINSTALL_INTERFACE


1
谢谢。正如您建议的那样,只需将${CMAKE_DL_LIBS}添加到target_link_libraries中即可解决问题。 - Shubham Agrawal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接