Page 1 of 1

编译蓝牙应用时报错

Posted: 2025-08-31 8:57
by ch2inLF
我尝试写一个简单的例程来使用蓝牙模块

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

int main() {
    // 获取第一个可用的蓝牙适配器ID
    int dev_id = hci_get_route(NULL);
    if (dev_id < 0) {
        perror("没有找到蓝牙适配器");
        exit(1);
    }
    
    // 打开蓝牙设备
    int sock = hci_open_dev(dev_id);
    if (sock < 0) {
        perror("无法打开蓝牙适配器");
        exit(1);
    }
    
    printf("正在扫描蓝牙设备...\n");
    
    // 设置扫描参数
    int max_rsp = 255;
    int flags = IREQ_CACHE_FLUSH;
    inquiry_info *ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
    
    // 开始扫描
    int num_rsp = hci_inquiry(dev_id, 8, max_rsp, NULL, &ii, flags);
    if (num_rsp < 0) {
        perror("扫描失败");
        close(sock);
        exit(1);
    }
    
    char addr[19] = {0};
    char name[248] = {0};
    
    printf("找到 %d 个设备:\n", num_rsp);
    printf("地址\t\t\t名称\n");
    
    // 遍历并显示找到的设备
    for (int i = 0; i < num_rsp; i++) {
        ba2str(&(ii+i)->bdaddr, addr);
        memset(name, 0, sizeof(name));
        
        // 尝试获取设备名称
        if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), name, 0) < 0) {
            strcpy(name, "[未知]");
        }
        
        printf("%s\t%s\n", addr, name);
    }
    
    // 清理资源
    free(ii);
    close(sock);
    
    return 0;
}
使用如下makefile编译

Code: Select all

# 设置交叉编译器路径和前缀
CROSS_COMPILE := /home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-
# 定义工具链
CC := $(CROSS_COMPILE)gcc
CXX := $(CROSS_COMPILE)g++
LD := $(CROSS_COMPILE)ld
AR := $(CROSS_COMPILE)ar
STRIP := $(CROSS_COMPILE)strip

# 包含路径设置
SYSROOT_PATH = /home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc
KERNEL_DIR = /home/ch2/work/Lyra-sdk/kernel
SRC_DIR = /home/ch2/work/easy_km

INCLUDE_FLAGS = -I${SRC_DIR}/include

# 目标名称
TARGET := test_ble

# 源文件
SRCS := test_ble.c
OBJS := $(SRCS:.c=.o)

# 编译选项
CFLAGS = --sysroot=$(SYSROOT_PATH) $(INCLUDE_FLAGS) -Wall -O2 

# 库路径和库名称 - 修复这里
LIB_PATHS = -L${SRC_DIR}/lib/usr/lib
LIBS = -lc -lbluetooth

LDFLAGS = $(LIB_PATHS) $(LIBS)

# 默认目标
all: $(TARGET)

# 链接目标文件生成可执行文件
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
# 编译C源文件为目标文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理生成的文件
clean:
	rm -f $(TARGET) $(OBJS)


# 声明伪目标
.PHONY: all clean install
libbluetooth.so和libc.so从板卡的/usr/lib拷贝到编译用的主机上,链接时报错如下

Code: Select all

/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc --sysroot=/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc -I/home/ch2/work/easy_km/include -Wall -O2  -o test_ble test_ble.o -L/home/ch2/work/easy_km/lib/usr/lib -lc -lbluetooth
/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/10.3.1/../../../../arm-none-linux-gnueabihf/bin/ld: /home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib/crt1.o: in function `_start':
/data/jenkins/workspace/GNU-toolchain/arm-10/src/glibc/csu/../sysdeps/arm/start.S:113: undefined reference to `__libc_csu_fini'
/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/10.3.1/../../../../arm-none-linux-gnueabihf/bin/ld: /data/jenkins/workspace/GNU-toolchain/arm-10/src/glibc/csu/../sysdeps/arm/start.S:120: undefined reference to `__libc_csu_init'
/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/10.3.1/../../../../arm-none-linux-gnueabihf/bin/ld: /home/ch2/work/easy_km/lib/usr/lib/libc.so: undefined reference to `_dl_audit_symbind_alt@GLIBC_PRIVATE'
/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/10.3.1/../../../../arm-none-linux-gnueabihf/bin/ld: /home/ch2/work/easy_km/lib/usr/lib/libc.so: undefined reference to `__nptl_change_stack_perm@GLIBC_PRIVATE'
/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/10.3.1/../../../../arm-none-linux-gnueabihf/bin/ld: /home/ch2/work/easy_km/lib/usr/lib/libc.so: undefined reference to `__nptl_set_robust_list_avail@GLIBC_PRIVATE'
/home/ch2/work/Lyra-sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/10.3.1/../../../../arm-none-linux-gnueabihf/bin/ld: /home/ch2/work/easy_km/lib/usr/lib/libc.so: undefined reference to `_dl_audit_preinit@GLIBC_PRIVATE'
collect2: error: ld returned 1 exit status
make: *** [Makefile:39: test_ble] Error 1
请问该如何解决

Re: 编译蓝牙应用时报错

Posted: 2025-09-05 1:40
by Crocodile
您好,二次开发中遇到的编译错误解决不作为技术支持内容,能提供的建议是使用buildroot中的交叉编译工具(${SDK_PATH}/buildroot/output/rockchip_rk3506_luckfox/host/bin/arm-buildroot-linux-gnueabihf-)与sysboot 路径(${SDK_PATH}/buildroot/output/rockchip_rk3506_luckfox/host/arm-buildroot-linux-gnueabihf/sysroot)
bluetooth的库属于后编译出来的不会在原始的交叉编译工具中使用,同时注意您的报错是来自libc库的报错,也有可能是SYSBOOT的指向错误