【发布时间】:2021-11-02 02:46:07
【问题描述】:
我正在尝试将 L2CAP 服务器(在 C 中 - 使用 BlueKitchen 的 btstack)与 UDP 服务器(在 C++ 中)集成。首先,我尝试将来自 L2CAP 服务器的代码添加到 UDP 服务器的“main.cpp”文件中。我使用extern "C" {...} 包含了所有相关的C 库和头文件。起初,我会在 btstack 文件的包含语句中遇到错误。我通过修改 make 文件以包含“INC = -I./directory/...”来解决这个问题。接下来,我处理了 g++ 编译器在粘贴的 C 代码中发现的问题(例如,在文字和字符串之间添加空格)。解决这些问题后,似乎没有一个 bstack 文件/函数被正确链接,因为这是我尝试“制作”时得到的:
"undefined reference to 'every single btstack function call in main.cpp'
我的生成文件。请注意,其中很多可能是不必要的/什么都不做。我只是在尝试任何东西,并从 btstack 端口 makefile 中借用行,看看它们是否可以工作。
CORE += \
btstack_chipset_bcm.c \
btstack_chipset_bcm_download_firmware.c \
btstack_control_raspi.c \
btstack_link_key_db_tlv.c \
btstack_run_loop_posix.c \
btstack_tlv_posix.c \
btstack_uart_posix.c \
btstack_slip.c \
hci_dump_posix_fs.c \
hci_transport_h4.c \
hci_transport_h5.c \
le_device_db_tlv.c \
main.c \
wav_util.c \
btstack_stdin_posix.c \
raspi_get_model.c \
rijndael.c
.INCLUDE : home/pi/udpDemo/inc/btstack-master/example/Makefile.inc
CC=g++
CFLAGS=-Wall -Wextra -pedantic -std=c++11
SRC=$(wildcard ./src/*.cpp)
OBJ=$(patsubst ./src/%.cpp, ./obj/%.o, $(SRC))
INC=-I./inc \
-I./inc/btsrc \
-I./inc/btsrc/ble \
-I./inc/btsrc/ble/gatt-service \
-I./inc/platform/embedded \
-I./inc/platform/posix \
-I./inc/chipset/bcm \
-I./inc/3rd-party/tinydir \
-I./inc/3rd-party/rijndael \
-I./inc/port/raspi \
-I./src
LDFLAGS += -lrt
VPATH += src
VPATH += inc/3rd-party/rijndael
VPATH += inc
VPATH += inc/btsrc \
VPATH += inc/btsrc/ble \
VPATH += inc/btsrc/ble/gatt-service \
VPATH += inc/platform/embedded \
VPATH += inc/platform/posix \
VPATH += inc/chipset/bcm \
VPATH += inc/3rd-party/tinydir \
VPATH += inc/3rd-party/rijndael \
VPATH += inc/port/raspi \
LIBS=
TARGET=test
bindir=/usr/local/bin
$(TARGET):$(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
$(OBJ):./obj/%.o:./src/%.cpp
$(CC) $(CFLAGS) -c $^ -o $@ -I$(INC)
clean:
rm -rf $(TARGET) $(OBJ)
install:$(TARGET)
install -g root -o root $(TARGET) $(bindir)/$(TARGET)
uninstall:$(bindir)/$(TARGET)
rm $(bindir)/$(TARGET)
【问题讨论】:
-
将另一个项目的代码转储到你的代码中通常不会有好的结果,尤其是当它是用不同的语言编写的时候。您最好的选择通常是将其他项目的代码编译到一个库中,然后从您自己的代码中调用该库。自己编译btstack代码能成功吗?
-
请不要在 StackOverflow 中发布图片或图片链接。剪切并粘贴格式正确的信息。
-
您已经设置了
LDFLAGS,但实际上并没有在链接行中使用它。此外,-I$(INC)是错误的,因为INC的内容已经包含所有-I前缀。另外,我不知道.INCLUDE目标应该在做什么:你是在尝试include那个文件吗?基本问题是您没有将包含这些符号定义的库(或目标文件)放入您的 makefile 中的链接命令中。因为我们不知道这些符号是在哪里定义的,所以我们不能说更多。 -
@bta:注意。 Btstack 代码自行编译、运行和工作。我扩展了它包含的一个例子。关于如何将其编译到库中并集成的任何建议?
-
@MadScientist 回复:图片:已注明,抱歉。我想这对眼睛来说会更容易。
LDFLAGS- 原谅我,但是链接线是什么?我对 Makefiles/make 很陌生。 '''.INCLUDE''' - 一个公认的可怜的尝试让它工作。在网上看到的。调用的符号/函数的定义分散在 btstack 中的许多文件中。在链接命令中包含这些定义的好策略是什么?