Makefile 区别:CMake中的lX11选项与目标链接库
我需要在我的Ubuntu 15.04 64位PC上使用OpenGL作为我的项目库,该PC由CMake 3.0.2构建。我安装的软件包: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
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