minigui:解决gvfb编译报错undefined reference to symbol 'XkbGetIndicatorState'

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/83380130

minigui在linux PC平台创建开发环境时,需要Virtual Frame Buffer 支持(gvfb,qvfb),minigui官网提供了这两个程序的源码,需要自己下载编译并安装到自己的PC上。

我用的是gvfb,minigui下载地址:http://www.minigui.org/downloads/gvfb-1.0.0.tar.gz

编译安装过程不复杂:
编译需要cmake支持,如果没有请安装:sudo apt-get install cmake
还需要依赖gtk2.0,如果没有请安装:sudo apt-get install libgtk2.0-dev

# 下载
wget http://www.minigui.org/downloads/gvfb-1.0.0.tar.gz
# 解包
tar xvf gvfb-1.0.0.tar.gz
cd gvfb-1.0.0
mkdir build
cd build
# 生成Makefile
cmake ..
# 编译并安装
sudo make install

然而在编译过程中出错了:

/usr/bin/ld: CMakeFiles/gvfb.dir/gvfb_linux.o: undefined reference to symbol 'XkbGetIndicatorState'

XkbGetIndicatorStateX11这个基础库的函数,显然是cmake脚本写得有问题

打开$gvfb-1.0.0/src/CMakeLists.txt这个脚本,如下:

SET (PROJECT_NAME gvfb)

LIST (APPEND SRC_LIST
    main.c gvfb_main.c gvfb_view.c gvfb_input.c gvfb_callbacks.c
    gvfb_interface.c gvfb_errmsg.c deviceskin.c skin.c)

IF (WIN32)
    LIST (APPEND SRC_LIST gvfb_win32.c getopt_long.c)
ELSE ()
    LIST (APPEND SRC_LIST gvfb_linux.c) 
ENDIF (WIN32)

#pkg-config info
INCLUDE (FindPkgConfig)

PKG_CHECK_MODULES (GTK gtk+-2.0 gthread-2.0)

IF (NOT GTK_FOUND)
    MESSAGE(FATAL_ERROR "Gtk+-2.0 not found")
ENDIF (NOT GTK_FOUND)

INCLUDE_DIRECTORIES (${GTK_INCLUDE_DIRS})
LINK_DIRECTORIES (${CMAKE_LIBRARY_PATH} ${GTK_LIBRARY_DIRS})
LIST (APPEND linkflags ${GTK_LIBRARIES})

ADD_EXECUTABLE (${PROJECT_NAME} ${SRC_LIST})

TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${linkflags})
INSTALL (TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)

在脚本最后增加一行message(STATUS linkflags=${linkflags})输出linkflags变量的值,再执行cmake ..,可以看出linkflags中果然是没有-lX11

输出如下:

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
-- Checking for modules 'gtk+-2.0;gthread-2.0'
--   Found gtk+-2.0, version 2.24.30
--   Found gthread-2.0, version 2.48.2
-- linkflags=gtk-x11-2.0gdk-x11-2.0pangocairo-1.0atk-1.0cairogdk_pixbuf-2.0gio-2.0pangoft2-1.0pango-1.0gobject-2.0fontconfigfreetypegthread-2.0glib-2.0
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gyd/Downloads/gvfb-1.0.0/build

确定原因解决问题的办法就很简单了,修改TARGET_LINK_LIBRARIES这一行,加入-lX11,重新执行cmake生成Makefile就解决问题:

TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${linkflags} -lX11)

猜你喜欢

转载自blog.csdn.net/10km/article/details/83380130