Ubuntu 14.04 , GLFW 3.2.1 , OpenGL 4.5.0 NVIDIA 367.57
I am trying to build the "Hello Triangle" OpenGL Example found at http://antongerdelan.net/opengl/hellotriangle.html but I am running into trouble. I downloaded the GLFW source and built out-of-source and installed with no extra flags or options.
Below is the src/CMakeLists.txt
file for Hello Triangle that is assembled from both the GLFW and from SO answers. After wrestling with linking order for a bit, the build process only gives me one error:
/usr/bin/ld: //usr/local/lib/libglfw3.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libX11.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
XConvertSelection
appears to come from X11, but I have included and linked to X11, as shown below. Why is this item not found if X11 has been included and linked?
=== src/CMakeLists.txt ===
# SOURCE CMAKELISTS
cmake_minimum_required( VERSION 2.6 )
project( HelloTriangle )
# ~ Special Libraries ~
# First you need to find the PkgConfig package. If this fails, you may need to install the pkg-config package for your distribution.
find_package(PkgConfig REQUIRED)
find_package(X11 REQUIRED)
if(NOT X11_FOUND)
message("ERROR: x11 not found")
endif(NOT X11_FOUND)
# Note that the dependencies do not include OpenGL or GLU, as GLFW loads any OpenGL, OpenGL ES or Vulkan libraries it needs at runtime and does not use GLU. If your application calls OpenGL directly, instead of using a modern extension loader library you can find it by requiring the OpenGL package.
find_package(OpenGL REQUIRED)
if(NOT OPENGL_FOUND)
message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)
# With just a few changes to your CMakeLists.txt, you can locate the package and target files generated when GLFW is installed.
find_package(glfw3 3.2 REQUIRED)
# This creates the CMake commands to find pkg-config packages. Then you need to find the GLFW package.
pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${X11_INCLUDE_DIR})
# This creates the CMake variables you need to use GLFW. To be able to include the GLFW header, you need to tell your compiler where it is.
include_directories(${GLFW_INCLUDE_DIRS})
# After everything is included, add the executable so that we can link
add_executable( HelloTriangle hello_triangle.cpp )
target_link_libraries(HelloTriangle ${X11_LIBRARIES})
# Seems like a similar issue: https://mcmap.net/q/1330205/-c-compile-error-when-includeing-irrlicht-static-lib
target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libX11.so)
target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1)
# target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libXxf86vm.so)
# If OpenGL is found, the OPENGL_FOUND variable is true and the OPENGL_INCLUDE_DIR and OPENGL_gl_LIBRARY cache variables can be used.
target_include_directories(HelloTriangle PUBLIC ${OPENGL_INCLUDE_DIR})
target_link_libraries(HelloTriangle ${OPENGL_gl_LIBRARY})
target_link_libraries(HelloTriangle ${GL_LIBRARY})
# The OpenGL CMake package also looks for GLU. If GLU is found, the OPENGL_GLU_FOUND variable is true and the OPENGL_INCLUDE_DIR and OPENGL_glu_LIBRARY cache variables can be used.
target_link_libraries(HelloTriangle ${OPENGL_glu_LIBRARY})
# You also need to link against the correct libraries. If you are using the shared library version of GLFW, use the GLFW_LIBRARIES variable.
target_link_libraries(HelloTriangle ${GLFW_LIBRARIES}) # DYNAMIC: Does not find: XConvertSelection
# If you are using the static library version of GLFW, use the GLFW_STATIC_LIBRARIES variable instead.
# target_link_libraries(HelloTriangle ${GLFW_STATIC_LIBRARIES}) # STATIC: Does not find: glewExperimental , glewInit
DSO missing from command line
usually means incorrect order of libraries for link. According to output, GLFW library uses some symbols from X11 library, so you need to link GLFW before X11. – AperientXConvertSelection
error, but now the symboldlclose@@GLIBC_2.2.5
cannot be found. It's very difficult to work out what's missing based on themake
output, even withVERBOSE=1
. – Celestadlclose@@GLIBC_2.2.5
issue was resolved with #23172394 – Celesta