【问题标题】:Problem linking when attempting to include btstack C files (.h & .c) in c++ program尝试在 c++ 程序中包含 btstack C 文件(.h 和 .c)时出现链接问题
【发布时间】: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 中的许多文件中。在链接命令中包含这些定义的好策略是什么?

标签: c++ c makefile linker


【解决方案1】:

这里似乎既有 makefile 问题,也有编译问题。同时解决这两个问题很困难。下面是您的 makefile 的简化和注释(但未经测试)版本,可能是您的一个很好的起点。

您的原始 makefile 看起来包含了很多来自 btstack 构建系统的东西。出于技术和许可方面的原因,像这样将两个单独的项目组合在一起通常不是一个好主意。使用第三方代码的典型方法是将该代码编译到一个库中,然后将您的代码链接到该库。您必须查阅 btstack 的文档以获取有关如何执行此操作的详细信息,我不熟悉该特定库。

# Which compiler to use
CC=g++
# Options to pass to the compiler
CFLAGS=-Wall -Wextra -pedantic -std=c++11 

# Options to pass to the linker
LDFLAGS=-Wall -Wextra
LDFLAGS+=-lbtstack            # Link with 'libbtstack.a'
LDFLAGS+=-L/path/to/btstack   # Where to find the btstack libraries that were built separately

# Source files to compile (everything in 'src' directory)
SRC=$(wildcard src/*.cpp)
# Convert names of source files into their corresponding object files
OBJ=$(patsubst src/%.cpp, obj/%.o, $(SRC))

# Directories where headers are kept
INC=-Isrc
INC+=-I/path/to/btstack/headers

# Name of the program
TARGET=test

# Rule for linking the .o files together to build the program
$(TARGET): $(OBJ)
    $(CC) $(LDFLAGS) -o $@ $^

# Rule for making a .o file from a .cpp file
obj/%.o: src/%.cpp
    $(CC) $(CFLAGS) -c $^ -o $@ -I$(INC)

# Rule for deleting output and temporary files
clean:
    rm -rf $(TARGET) $(OBJ)

这将编译您的src 目录中的所有.cpp 文件并将它们与libbtstack.a 链接以创建一个名为test 的程序。构建 btstack 库后,将 LDFLAGSINC 变量分别更新为 btstack 库和标头的实际路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多