使用 GCC 编译 HackRF
最近在 Linux 下终于弄明白了如何用 GCC 来编译 HackRF 环境了,终于可以不依赖于 CMake 脚本了。
简单的 Hackrf C 语言 Demo 如下:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <hackrf.h>
// This function initiate hackrf, and checks its connection and ID
int hackrf_init_and_checkID(void **rf_dev){
hackrf_device *dev = NULL;
int result = HACKRF_SUCCESS;
// Init Hackrf
result = hackrf_init();
if(result != HACKRF_SUCCESS){
printf("HackRF Init Fail \n");
}
else{
printf("HackRF Init Success \n");
}
// Open Hackrf
result = hackrf_open(&dev);
if(result != HACKRF_SUCCESS){
printf("Hackrf not found \n");
}
else{
printf("Hackrf Found \n");
}
// Read ID
uint8_t board_id;
result = hackrf_board_id_read(dev,&board_id);
if(result != HACKRF_SUCCESS){
printf("Read HackRF Board ID FAIL \n");
}
else{
printf("HackRF Board ID is: %u \n",board_id);
}
// Read Board Part ID and Serail Number
read_partid_serialno_t serialno_partid;
result = hackrf_board_partid_serialno_read(dev,&serialno_partid);
if(result != HACKRF_SUCCESS){
printf("Read Serail ID FAIL \n");
}
else{
printf("HackRF Board Part ID is: 0x%08x 0x%08x\n",serialno_partid.part_id[0],serialno_partid.part_id[1]);
printf("HackRF Board Serial Number is: 0x%08x 0x%08x 0x%08x 0x%08x\n",serialno_partid.serial_no[0],serialno_partid.serial_no[1],serialno_partid.serial_no[2],serialno_partid.serial_no[3]);
}
// Read HACKRF firmware Version
uint8_t hackrf_version_length = 255;
char hackrf_version[hackrf_version_length];
result = hackrf_version_string_read(dev,&hackrf_version[0],hackrf_version_length);
if(result != HACKRF_SUCCESS){
printf("Read Firmware Version FAIL \n");
}
else{
printf("HACKRF_Version is: %s \n",hackrf_version);
}
(*rf_dev) = dev;
return 1;
}
int main(void){
// Parameters
void* rf_dev;
int result = HACKRF_SUCCESS;
// Initiate HackRF
hackrf_init_and_checkID(&rf_dev);
// Close HackRF
result = hackrf_close(rf_dev);
if(result != HACKRF_SUCCESS){
printf("Hackrf not closed\n");
}
else{
printf("Hackrf closed \n");
}
}
这个简单的 C demo 实现了 hackrf 初始化和 ID、firmware version 读取,其中 hackrf_init 等函数都是来自于 hackrf.h 中定义。在前面的 blog 中讲到用 cmake file 的编译方法,但是需要创建较为复杂的 cmakelist 文件,而且像 hackrf 的 library 还需要通过一个 FindLIBHACKRF.cmake file 来帮助找到系统中 libhackrf 的位置。
那么现在,我们通过两行简单的 gcc 命令的方式,也可以完成编译:
gcc -c -I/usr/local/include/libhackrf HackRF_SA_main.c -o HackRF_SA_main.o
gcc HackRF_SA_main.o -L/usr/local/lib -lhackrf -o HackRF_SA
上述 gcc 指令的解释如下:
-
gcc-c -I 用于指定 hackrf.h 的位置。那么一般安装 make hackrf 之后,都会在本地 usr/local/include 中找到一个 libhackrf 文件,hackrf.h 就在这里
-
然后通过 -o 将 main.c 文件变为可以执行的 main.o 文件
-
然后,通过 gcc -L 命令将 libhackrf.so 动态库与 main.o 可执行文件进行关联,同样的,安装完成后 libhackrf.so 一般都会放在本地的 usr/local/lib 中,-lhackrf 则会自动增加 lib 和 .so 字符。
-
最后同样的通过 -o 生成可执行的 HackRF_SA 可执行程序,直接 ./HackRF_SA 即可运行
可以看到上述 GCC 方式更直接与易理解。另外,如果在本地 usr/ 路径下没有找到 hackrf.h 和 libhackrf.so,我们也可以在 hackrf-master/host 和 hackrf-master/host/build 中找到相应的内容。
最后,插上 Hackrf,执行 HackRF_SA 之后,应该就可以看到 HackRF 的信息了~