Makefile 区别:CMake中的lX11选项与目标链接库

Makefile 区别:CMake中的lX11选项与目标链接库,makefile,linker,cmake,x11,Makefile,Linker,Cmake,X11,我需要在我的Ubuntu 15.04 64位PC上使用OpenGL作为我的项目库,该PC由CMake 3.0.2构建。我安装的软件包:mesa公共开发mesa utils额外libgl1 mesa开发libglu1 mesa开发libglapi mesa libx11开发libxi开发libxinerama开发libxcursor开发libxrandr开发 运行cmake和Makefile后,我得到以下链接错误: /usr/bin/ld: /home/user/CMU462/DrawSVG/as

我需要在我的Ubuntu 15.04 64位PC上使用OpenGL作为我的项目库,该PC由CMake 3.0.2构建。我安装的软件包:
mesa公共开发mesa utils额外libgl1 mesa开发libglu1 mesa开发libglapi mesa libx11开发libxi开发libxinerama开发libxcursor开发libxrandr开发

运行cmake和Makefile后,我得到以下链接错误:

/usr/bin/ld: /home/user/CMU462/DrawSVG/asst1_drawsvg/lib/libglfw.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/libX11.so: error adding symbols: DSO missing from command line
我选中了
/usr/lib/x86_64-linux-gnu/libX11。所以
,它确实存在

我找到了一个,似乎我没能将我的项目链接到X11库。答案是add
-lX11
选项可以解决这个问题

或者我链接
CMakeLists.txt
中的X11库,根据:

运行cmake,我得到以下输出:

-- X11_FOUND = 1
-- X11_INCLUDE_DIR = /usr/include
-- X11_LIBRARIES = /usr/lib/x86_64-linux-gnu/libX11.so;/usr/lib/x86_64-linux-gnu/libXext.so
但我还是犯了前面提到的错误

问题:X11库可以通过

  • 使用
    CMakeLists.txt
    中的
    target\u link\u库
    ,或
  • -lX11
    选项直接添加到编译命令
  • 他们之间有什么区别?
    CMakeLists.txt
    中的链接是否直接导致生成
    Makefile
    中的
    -lX11
    选项

    如果是,我是否在
    CMakeLists.txt
    中做错了什么


    更新

    让我们举个例子,下面是我的构建过程

    安装所需库:安装OpenGL和其他相关库(GLEW和GLFW库在本项目中提供):
    mesa通用开发平台utils额外libgl1 mesa开发平台libglu1 mesa开发平台libglapi mesa libxi开发平台libxinerama开发平台libxcursor开发平台libxrandr开发平台

    运行CMake:然后使用提供的
    CMakeLists.txt
    ,一切正常

    制作:制作项目时,出现以下错误:

    /usr/bin/ld: /home/user/CMU462/DrawSVG/asst1_drawsvg/lib/libglfw.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
    /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/libX11.so: error adding symbols: DSO missing from command line
    
    我搜索了很多次,所有的答案都说glfw3和x11的链接不正确导致了错误:

  • 缺少
    -X11
    选项。但是,在第26行中存在此选项
  • 图书馆陈列得井然有序。我使用
    pkg config--libs
    命令检查依赖关系,所有库都按顺序排列在的第17到29行
  • 唯一可能的原因是库的编译选项(第17行到第29行)和的
    目标链接库(第116行)的顺序


    否则,在我的过程中,我必须忽略另一个错误。

    您应该依赖
    target\u link\u库
    ,因为这是官方和通用的方法。您知道X11的名称,但对于不同的平台,理论上可能会有所不同。不是在这种情况下,而是在一般情况下。尝试删除
    link\u目录(${X11\u库})
    ,您应该只按目标链接库进行链接,就像在下一行中所做的那样。删除
    link\u目录(${X11\u库})
    ,该变量包含文件路径,而不是目录名。您不需要设置
    link_目录
    ,因为
    X11_库
    包含完整路径。您得到的错误是在添加了
    -lX11
    (或
    目标链接库
    )之后。我猜您还必须链接到opengl。可能相关,@Antonio抱歉误导您,我在
    CMakeLists.txt
    中链接了OpenGL,但没有在此处发布代码。正如我所看到的,根据问题中的解释和您评论中的相关答案,是到X11库的不正确链接导致了错误。我正在寻找一个适当的方式做链接。
    /usr/bin/ld: /home/user/CMU462/DrawSVG/asst1_drawsvg/lib/libglfw.a(x11_window.c.o): undefined reference to symbol 'XConvertSelection'
    /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/libX11.so: error adding symbols: DSO missing from command line