After many tries and a lot research, I still can't link OpenGL. The software I'm trying to compile was made on Ubuntu 18.04 and compiled fine while I'm now on Ubuntu 20.04.
This is the CMakeLists used on Ubuntu 18.04:
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
# Project configuration
project(grid_3d)
set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 0)
set(PROJECT_VERSION_PATCH 0)
# Define folders
set(EXT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ext)
set(INC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc)
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
set(BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
set(LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib)
# Compiler settings
set(CMAKE_CXX_STANDARD 17)
set(CXX_OPTIONS "-DDEBUG_UI")
set(warnings "-Wall -Wextra -Werror -Wno-unused -Wno-deprecated-declarations")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${warnings} ${CXX_OPTIONS} -pthread")
# Output
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIB_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
set(CMAKE_LEGACY_CYGWIN_WIN32 0)
# Find librealsense2 installed package
find_package(realsense2 REQUIRED)
# Find pcl installed package
find_package(PCL 1.8 REQUIRED COMPONENTS common io filters features kdtree segmentation)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
# Find GLFW3 (sudo apt install libglfw3-dev)
find_package(PkgConfig REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS})
# Libraries
set(LIBS
${realsense2_LIBRARY}
${PCL_LIBRARIES}
)
# Files
include_directories(${INC_DIR})
# include_directories(${EXT_DIR}/imgui-1.79)
file(GLOB SOURCES
${INC_DIR}/*.hpp
${INC_DIR}/ui/*.hpp
${SRC_DIR}/*.cpp
)
# Binaries
add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})
target_link_libraries(${CMAKE_PROJECT_NAME} ${LIBS})
target_link_libraries(${CMAKE_PROJECT_NAME} ${GLFW_LIBRARIES})
This is the only OpenGL-related includes in my project:
#define GL_SILENCE_DEPRECATION
#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>
I have the following shared libraries:
libglib-2.0.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libglib-2.0.so.0
libglib-2.0.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libglib-2.0.so
libglfw.so.3 (libc6,x86-64) => /lib/x86_64-linux-gnu/libglfw.so.3
libglfw.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libglfw.so
ibOpenGL.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libOpenGL.so.0
libOpenGL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libOpenGL.so
libGLdispatch.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLdispatch.so.0
libGLdispatch.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLdispatch.so
libGLX_nvidia.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLX_nvidia.so.0
libGLX_mesa.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLX_mesa.so.0
libGLX.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLX.so.0
libGLX.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLX.so
libGLU.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLU.so.1
libGLU.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLU.so
libGLEW.so.2.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLEW.so.2.1
libGLEW.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLEW.so
libGLESv2_nvidia.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLESv2_nvidia.so.2
libGLESv2.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLESv2.so.2
libGLESv2.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLESv2.so
libGLESv1_CM_nvidia.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLESv1_CM_nvidia.so.1
libGLESv1_CM.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLESv1_CM.so.1
libGLESv1_CM.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGLESv1_CM.so
libGL.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGL.so.1
libGL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGL.so
libEGL_nvidia.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libEGL_nvidia.so.0
libEGL_mesa.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libEGL_mesa.so.0
libEGL.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libEGL.so.1
libEGL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libEGL.so
I tried to add the -lGL
, -lglfw
linker options without any success.
How can I link OpenGL to my program on Ubuntu 20.04 64-bit? And why does it change between Ubuntu 18.04 and Ubuntu 20.04?
It's hard to diagnose your problem without the minimal reproducible example. But what I see is that your system has both libGL
and libOpenGL
. This may mean that libGL
is just a proxy for libglvnd
and doesn't contain any of the GL API functions.
But you shouldn't rush to link directly to libOpenGL
. Different systems may be configured differently. Instead, the correct way of locating OpenGL objects with CMake is to use find_package(OpenGL)
and then include OpenGL::GL
in your target_link_libraries
.
Example dummy project:
CMakeLists.txt
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
project(demo)
find_package(OpenGL)
add_executable(prog test.cpp)
target_link_libraries(prog OpenGL::GL)
test.cpp
#include <GL/gl.h>
int main()
{
glLoadIdentity();
}