minigui:解決gvfb編譯報錯undefined reference to symbol 'XkbGetIndicatorState'
阿新 • • 發佈:2018-11-01
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'
XkbGetIndicatorState
是X11
這個基礎庫的函式,顯然是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)