C++ CMake,GLFW:X11包括在内,但';XConvertSelection';找不到

C++ CMake,GLFW:X11包括在内,但';XConvertSelection';找不到,c++,opengl,cmake,x11,glfw,C++,Opengl,Cmake,X11,Glfw,Ubuntu 14.04、GLFW 3.2.1、OpenGL 4.5.0、NVIDIA 367.57 我正在尝试构建“Hello Triangle”OpenGL示例,该示例位于 但是我遇到了麻烦。我下载了GLFW源代码并构建了源代码,安装时没有额外的标志或选项 下面是Hello Triangle的src/CMakeLists.txt文件,该文件由GLFW和SO答案组合而成。在与链接顺序纠缠了一段时间后,构建过程只给了我一个错误: /usr/bin/ld://usr/local/lib/libgl

Ubuntu 14.04、GLFW 3.2.1、OpenGL 4.5.0、NVIDIA 367.57

我正在尝试构建“Hello Triangle”OpenGL示例,该示例位于 但是我遇到了麻烦。我下载了GLFW源代码并构建了源代码,安装时没有额外的标志或选项

下面是Hello Triangle的
src/CMakeLists.txt
文件,该文件由GLFW和SO答案组合而成。在与链接顺序纠缠了一段时间后,构建过程只给了我一个错误:

/usr/bin/ld://usr/local/lib/libglfw3.a(x11_window.c.o):对符号“XConvertSelection”的未定义引用
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/libX11.so:添加符号时出错:命令行中缺少DSO
collect2:错误:ld返回了1个退出状态

XConvertSelection
似乎来自X11,但我已经包含并链接到X11,如下所示。如果包含并链接了X11,为什么找不到此项

==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: http://stackoverflow.com/questions/14772681/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
# SOURCE CMAKELISTS

cmake_minimum_required( VERSION 2.6 )
project( HelloTriangle )

# ~ Special Libraries ~
find_package(PkgConfig REQUIRED) # First you need to find the PkgConfig package

find_package(X11 REQUIRED) # Make sure x is there 
if(NOT X11_FOUND)
    message("ERROR: x11 not found")
endif(NOT X11_FOUND)

find_package(OpenGL REQUIRED) # Make sure OpenGL is available for direct calls
if(NOT OPENGL_FOUND)
    message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)

find_package(glfw3 3.2 REQUIRED) # locate the package and target files generated when GLFW is installed.

pkg_search_module(GLFW REQUIRED glfw3) # CMake commands to find pkg-config packages

include_directories(${GLFW_INCLUDE_DIRS}) # creates the CMake variables you need to use GLFW.
include_directories(${X11_INCLUDE_DIR}) # Get all the x stuff

add_executable( HelloTriangle hello_triangle.cpp ) # After everything is included, add the executable 

target_include_directories(HelloTriangle PUBLIC ${OPENGL_INCLUDE_DIR}) # Obviously

target_link_libraries(HelloTriangle ${GLFW_LIBRARIES}) # If using the shared library, GLFW_LIBRARIES
# target_link_libraries(HelloTriangle ${GLFW_STATIC_LIBRARIES}) # If using the static library, GLFW_STATIC_LIBRARIES
target_link_libraries(HelloTriangle ${OPENGL_gl_LIBRARY}) # More OpenGL stuff I guess?
target_link_libraries(HelloTriangle ${GL_LIBRARY})
target_link_libraries(HelloTriangle ${OPENGL_glu_LIBRARY}) # The OpenGL CMake package also looks for GLU.
# http://stackoverflow.com/questions/23171894/cant-compile-easy-source-in-c-and-opengl-glfw-in-linux-in-netbeans
target_link_libraries(HelloTriangle GLEW m dl Xinerama Xrandr Xi Xcursor pthread) # GLFW misses this stuff!
# Seems like a similar issue: http://stackoverflow.com/questions/14772681/c-compile-error-when-includeing-irrlicht-static-lib
target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libX11.so) # x11 linking misses this stuff!
target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1)
target_link_libraries(HelloTriangle ${X11_LIBRARIES}) # x11 !

在深入了解SO并与链接顺序搏斗了几个小时后,我有以下几点:

==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: http://stackoverflow.com/questions/14772681/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
# SOURCE CMAKELISTS

cmake_minimum_required( VERSION 2.6 )
project( HelloTriangle )

# ~ Special Libraries ~
find_package(PkgConfig REQUIRED) # First you need to find the PkgConfig package

find_package(X11 REQUIRED) # Make sure x is there 
if(NOT X11_FOUND)
    message("ERROR: x11 not found")
endif(NOT X11_FOUND)

find_package(OpenGL REQUIRED) # Make sure OpenGL is available for direct calls
if(NOT OPENGL_FOUND)
    message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)

find_package(glfw3 3.2 REQUIRED) # locate the package and target files generated when GLFW is installed.

pkg_search_module(GLFW REQUIRED glfw3) # CMake commands to find pkg-config packages

include_directories(${GLFW_INCLUDE_DIRS}) # creates the CMake variables you need to use GLFW.
include_directories(${X11_INCLUDE_DIR}) # Get all the x stuff

add_executable( HelloTriangle hello_triangle.cpp ) # After everything is included, add the executable 

target_include_directories(HelloTriangle PUBLIC ${OPENGL_INCLUDE_DIR}) # Obviously

target_link_libraries(HelloTriangle ${GLFW_LIBRARIES}) # If using the shared library, GLFW_LIBRARIES
# target_link_libraries(HelloTriangle ${GLFW_STATIC_LIBRARIES}) # If using the static library, GLFW_STATIC_LIBRARIES
target_link_libraries(HelloTriangle ${OPENGL_gl_LIBRARY}) # More OpenGL stuff I guess?
target_link_libraries(HelloTriangle ${GL_LIBRARY})
target_link_libraries(HelloTriangle ${OPENGL_glu_LIBRARY}) # The OpenGL CMake package also looks for GLU.
# http://stackoverflow.com/questions/23171894/cant-compile-easy-source-in-c-and-opengl-glfw-in-linux-in-netbeans
target_link_libraries(HelloTriangle GLEW m dl Xinerama Xrandr Xi Xcursor pthread) # GLFW misses this stuff!
# Seems like a similar issue: http://stackoverflow.com/questions/14772681/c-compile-error-when-includeing-irrlicht-static-lib
target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libX11.so) # x11 linking misses this stuff!
target_link_libraries(HelloTriangle /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1)
target_link_libraries(HelloTriangle ${X11_LIBRARIES}) # x11 !

这种精确的设置在Linux系统上可能不是通用的,但我认为它可能会帮助某些人制定成功的链接顺序。

命令行中缺少DSO通常意味着链接库的顺序不正确。根据输出,GLFW库使用了X11库中的一些符号,因此您需要在X11之前链接GLFW。@Tsyvarev,这消除了
XConvertSelection
错误,但现在找不到符号
dlclose@@GLIBC_2.2.5
。即使使用
VERBOSE=1
,也很难根据
make
输出找出缺少的内容。使用解决了
dlclose@@GLIBC_2.2.5
问题