首页 > 解决方案 > 为什么我收到“未定义的引用”错误。(使用make的链接器问题)

问题描述

我知道有很多类似的问题,但似乎没有一个能回答我的问题。我正在编写单元测试代码,我正在调用以下函数,

ads1259_init(&settings, &storage);

这应该在 x86 上启动一个虚假的 spi 通信。但是,我收到链接器错误未定义对“ads1259_init”的引用。

我已将头文件中的函数定义为

StatusCode ads1259_init(Ads1259Settings* settings, Ads1259Storage* storage);

并在 .c 文件中作为

StatusCode ads1259_init(Ads1259Settings* settings, Ads1259Storage* storage) {...}

我们正在为我们的构建系统使用make(我对此知之甚少),并且当我运行make test LIBRARY=ms-drivers PLATFORM=x86测试该目录中所有驱动程序的命令时应该调用的驱动程序库的make文件是:

# Defines $(T)_SRC, $(T)_INC, $(T)_DEPS, and $(T)_CFLAGS for the build makefile.
# Tests can be excluded by defining $(T)_EXCLUDE_TESTS.
# Pre-defined:
# $(T)_SRC_ROOT: $(T)_DIR/src
# $(T)_INC_DIRS: $(T)_DIR/inc{/$(PLATFORM)}
# $(T)_SRC: $(T)_DIR/src{/$(PLATFORM)}/*.{c,s}

$(T)_DEPS := $(PLATFORM_LIB) libcore

ifeq (x86,$(PLATFORM))
$(T)_test_ltc_afe_MOCKS := spi_exchange
endif

我很困惑,因为大约有 8 个其他驱动程序使用相同的 make 文件,并且设置的文件结构与我的完全相同。当我注释掉这一行并运行命令时,它们都测试得很好。我正在使用 VS 代码,我们所有的构建都发生在 vagrant 中,这是一个 linux 虚拟盒。我认为问题在于链接器没有找到 .c 实现,但我不知道为什么。如果有人有任何建议,他们将不胜感激。

标签: cmakefilelinkerld

解决方案


回答:我在错误的平台上构建,所以链接器在错误的目录中查找


推荐阅读