目标:使用 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 运行,就可以听到声音了。