1. 程式人生 > >minigui:解決gvfb編譯報錯undefined reference to symbol 'XkbGetIndicatorState'

minigui:解決gvfb編譯報錯undefined reference to symbol 'XkbGetIndicatorState'

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)