標籤:
目標:使用 Visual Studio 編譯gnuradio的樣本程式dial_tone一、裝備環境1、安裝 Visual Studio 2010
略
2、安裝 Boost 庫
從 Boost 官網下載最新的源碼包,解壓後,按照 GnuRadio 原始碼目錄下的 README.building-boost 檔案描述,對 Boost 庫 進行編譯安裝 。開啟一個 Visual Studio 2010 命令列視窗,運行:
bootstrap.bat
set BOOST_PREFIX=<path_to_install_boost_dir>
b2 --prefix=%BOOST_PREFIX% --with-thread --with-date_time --with-program_options --with-filesystem --with-system --with-test --with-regex --layout=versioned threading=multi install
【注1】:README.building-boost 文檔中給出的命令沒有 --with-test 和 --with-regex 兩個參數,但是在編譯的過程中用到了這兩個庫,因此我加上了這兩個庫。
【注2】:README.building-boost 文檔中給出的命令中,variant=release 參數表示產生Boost 庫的 release 版本。為了將來開發自己的程式調試方便,還需要 Boost 庫的 debug 版本,因此我去掉了這個參數,同時產生 debug 和release 版本的Boost庫
【注3】:如果安裝了多個版本的 Visual Studio,則需要增加 toolset=msvc-10.0 指定使用Visual Studio 2010的編譯器。我安裝了Visual Studio 2013之後,即使從 Visual Studio 2010 命令列進行 Boost 庫的編譯,使用的也是2013的編譯器(msvc-12.0)。
3、安裝 Python
從Python官網下載Python 2.7.x,按照預設選項進行安裝即可。安裝完畢後,還需要安裝 Cheetah 包,我是通過 pip 安裝的 Cheetah 2.4.4,也可以到 Cheetah 官網下載離線安裝。
4、安裝 mingw-binutils
在用CMake 配置gnuradio源碼時,需要指定 AT&T ASM 彙編器,安裝 mingw-binutils 即可。事實上,在Windows平台下編譯gnuradio,沒有彙編檔案需要處理,可能是在編寫cmake指令碼時偷懶了吧。
5、準備 FFTW
到fftw官網下載先行編譯的windows DLL檔案,解壓後按照README-WINDOWS 檔案中的操作步驟,產生 libfftw3f-3.lib 這個庫檔案。
6、準備 cmake
從cmake官網下載最新的cmake工具,我使用的是3.3.0
二、使用 CMake 產生Visual Studio項目
準備一個空目錄作為Cmake產生 Visual Studio 項目的輸出目錄。首先在cmake-gui中定義如下的CMake變數:
BOOST_ROOT |
Boost 庫安裝目錄路徑,即上面提到的 %BOOST_PREFIX% |
BOOST_ALL_DYN_LINK |
設定為 False |
Boost_INLCUDE_DIR |
Boost 庫標頭檔路徑,即 %BOOST_PREFIX%/include/boost-1_57 |
Boost_LIBRARY_DIRS |
Boost 庫檔案路徑,即 %BOOST_PREFIX%/lib |
CMAKE_ASM-ATT_COMPILER |
AT&T ASM 彙編器路徑,即 %MINGW_PREFIX%/bin/as.exe |
FFTW3F_INCLUDE_DIRS |
FFTW 庫的標頭檔目錄 |
FFTW3F_LIBRARIES |
libfftw3f-3.lib 檔案路徑 |
CMAKE_INSTALL_PREFIX |
安裝 GnuRadio 的目錄路徑 |
然後點擊 Configuration 按鈕進行配置,CMake會列出所有相關的組態變數。勾選"Grouped"對列出的配置項分組查看,在"ENABLE"組下,去掉與dial_tone無關的模組,如:
然後再次點擊"Configuration"進行配置,此時應當沒有錯誤訊息出現。最後點擊"Generate"就可以產生 Visual Studio 解決方案和項目。
三、修改 gnuradio 原始碼
gnuradio的原始碼直接產生的 Visual Studio 工程編譯會報錯誤,下面分別針對幾個主要的錯誤進行解決。
1、error D8016: "/O2"和"/RTC1"命令列選項不相容
該錯誤的產生是由於 CMake 指令碼將 "/O2"這個最佳化參數添加到了 Debug 模式下的編譯器參數中,解決方式是修改 gnuradio 源碼根目錄下的 CMakeLists.txt 檔案,找到如下的內容,將兩行SET命令注釋掉:
# Append -O2 optimization flag for Debug builds #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O2") #SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O2")
2、error C1083: 無法開啟包括文 件:"pthread.h": No such file or directory
這個錯誤出現在編譯 volk 模組的過程中,解決方案是修改 volk/lib/CMakeLists.txt,定位到下面的位置,增加標記為紅色的內容:
######################################################################## # Set local include directories first ######################################################################## include_directories( ${CMAKE_BINARY_DIR}/include ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/kernels ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} "<path_to_pthreads_dir>/include" )
3、error LNK1104: 無法開啟檔案"libboost_xxxxx-vc100-mt-gd-1_57.lib"
這個錯誤出現在編譯 volk和gnuradio-runtime的過程中,解決方案是對下面的幾個 CMakeLists.txt進行修改,增加標記為紅色的內容:
(1) volk/apps/CMakeLists.txt
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/include ${CMAKE_SOURCE_DIR}/lib ${CMAKE_BINARY_DIR}/lib ${Boost_INCLUDE_DIRS} ) link_directories(${Boost_LIBRARY_DIRS})
(2) gnuradio-runtime/lib/CMakeLists.txt
include_directories(${GNURADIO_RUNTIME_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/../include/ ${VOLK_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) link_directories(${Boost_LIBRARY_DIRS})
(3) gr-audio/examples/c++/CMakeLists.txt
include_directories( ${GR_AUDIO_INCLUDE_DIRS} ${GR_ANALOG_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) link_directories(${Boost_LIBRARY_DIRS})
4、fatal error LNK1104: 無法開啟檔案"boost_unit_test_framework-vc100-mt-gd-1_57.lib"
這個錯誤發生在test_all項目產生過程中,解決方案是,修改volk/apps/CMakeLists.txt,找到如下代碼位置,刪掉紅色刪除線標記的內容。
if(Boost_FOUND) set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc PROPERTIES COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK;BOOST_TEST_MAIN" ) …… endif(Boost_FOUND)
四、編譯和安裝
開啟 Visual Studio 2010命令提示,切換到 GnuRadio 的配置緩衝(Cache)目錄,運行:
msbuild install.vcxproj /p:configuration=release。產生的內容將會被安裝到 CMAKE_INSTALL_PREFIX 所指出的目錄中
五、運行 dial_tone
在CMAKE_INSTALL_PREFIX/share/gnuradio/examples/audio 目錄下,將 dial_tone.exe 複製到 CMAKE_INSTALL_PREFIX/bin 目錄下,同時將 libfftw3f-3.dll 複製到 CMAKE_INSTALL_PREFIX/bin 目錄下,雙擊 dial_tone.exe 運行,就可以聽到聲音了。
Gnuradio 學習筆記(1)使用Visual Studio編譯gnuradio