c - 海湾合作委员会 : linker error : undefined reference while using a constant data shared between two files

标签 c gcc linker g++

我的问题看起来很简单,但是在谷歌搜索寻找解决方案时我没有找到解决方案:-(

我正在编写一个交叉编译的 C 程序,以便在嵌入式 Linux 上运行。在其中,我需要在两个不同的文件中使用常量结构。 所以我在 .h 文件中定义了它:

const s_GroupData Grp_Para_loivariable_Data ={      
.groupId = GRP_PARA_LOIVARIABLE,
.groupAddress = GRP_PARA_LOIVARIABLE_ADDRESS,
.dataNr  = 4,

.dataList = 
{

    {"service:heating_circuit:1:heating_curve:variable:temp_ext", 12, NegateMsbDivideBy10AndConvertCelsiusToK, ConvertKelvinToCelsiusMultiplyBy10AndSetMsb}, 

    {"service:heating_circuit:1:heating_curve:variable:temp_int", 13, DivideBy10AndConvertCelsiusToK, ConvertKelvinToCelsiusAndMultiplyBy10}, 

    {"service:heating_circuit:1:heating_curve:variable:mod_set", 14, NegateMsbDivideBy10AndConvertCelsiusToK, ConvertKelvinToCelsiusMultiplyBy10AndSetMsb}, 

    {"service:heating_circuit:1:heating_curve:variable:mod_dt", 15, NegateMsbDivideBy10AndConvertCelsiusToK, ConvertKelvinToCelsiusMultiplyBy10AndSetMsb}, 

}

};

...我将此文件包含到需要 Grp_Para_loivariable_Data (BIO_high_param_read.c) 的文件之一中。在另一个文件(BIO_set_params.c)中,我仅将 Grp_Para_loivariable_Data 声明为 extern:

extern const s_GroupData Grp_para_loivariable_Data;

这样,我在为目标构建可执行文件时就不会出现错误... ...但我还使用 C++ 测试框架编译和链接相同的文件,以便在主机(debian linux)上进行模块测试。并且链接器找不到我的常量:

BIO_setparams.o : In the function « ChangeVariableHeatingCurveParams » :
BIO_set_params.c:(.text+0x6ea) : undefined reference to « Grp_para_loivariable_Data »
BIO_setparams.o:(.data.rel+0x0) : undefined reference to « Grp_para_loivariable_Data »
collect2: error: ld returned 1 exit status
Makefile:62 : recipe for target « TestBIO » failed

我尝试在 BIO_set_params.c、BIO_set_params.h 和测试文件的 .h 中将此常量声明为 extern(之前使用 extern“C”,因为我的测试是用 C++ 编写的)。但我仍然收到此链接器错误。

这是我的 makefile:

# NATIVE COMPILERS
CC=gcc
CP=c++
PROJECT_SRC_DIR= ../src
PROJECT_INC_DIR= ../headers
# Project flags
P_CPPFLAGS=-I$(PROJECT_INC_DIR) -I$(PROJECT_SRC_DIR)/LIB -I$(PROJECT_SRC_DIR)/BIO 

   ## Tests
   TEST_SRC_DIR=./src
   TEST_INC_DIR=./include
   TEST_H_DIR=./headers
   TEST_LIB_DIR=./lib`

    # Tests flags
   T_CPPFLAGS= -Wno-return-type -I$(TEST_INC_DIR) -I$(TEST_H_DIR)

   LDFLAGS= -lgtest -l:libiniparser.so.0 -Wl,-rpath,./lib -lpthread -ljansson -lcrypto -lcurl -lhashmap -L$(TEST_LIB_DIR) -lhiredis -levent -lgcov

   CFLAGS= -fprofile-arcs -ftest-coverage --coverage

   # Executables
   LIB= TestLIB
   BIO= TestBIO

   # Colors

   GREEN = \033[0;32m
   RED = \033[0;31m
   WHITE = \033[0m
   BLUE= \033[34m

   all: data-model-gen $(BIO) allprint

   # RunAll
   runTests:
    @../$(BIO) || exit 1;

   # LIB
   lib_redis_if.o: $(PROJECT_SRC_DIR)/LIB/LIB_redis_if.c
    @$(CC) -o $@ -c $< -DTESTS $(T_CPPFLAGS) $(P_CPPFLAGS) --coverage && echo "$(BLUE)$(CC) $^$(WHITE)"

   lib_conversion.o: $(PROJECT_SRC_DIR)/LIB/LIB_conversion.c
    @$(CC) -o $@ -c $< -DTESTS $(T_CPPFLAGS) $(P_CPPFLAGS) --coverage && echo "$(BLUE)$(CC) $^$(WHITE)"

   lib_modbus.o: $(PROJECT_SRC_DIR)/LIB/LIB_modbus_tcp_sync.c
    @$(CC) -o $@ -c $< -DTESTS $(T_CPPFLAGS) $(P_CPPFLAGS) && echo "$(BLUE)$(CC) $^$(WHITE)"

   # BIO
   $(BIO): main.o BIO_SN.o tbio.o BIO_data_read.o lib_modbus.o lib_redis_if.o lib_conversion.o  BIO_main.o BIO_setparams.o BIO_version_nr_read.o BIO_high_param_read.o
    @$(CP) -o $@ $^ $(LDFLAGS) -lhiredis -lmodbus && echo "$(GREEN)BIO tests successfully created. Run './$@'$(WHITE)\n"

   BIO_SN.o: $(PROJECT_SRC_DIR)/BIO/BIO_SN.c
    @$(CC) -o $@ -c $< -DTESTS $(P_CPPFLAGS) $(T_CPPFLAGS) --coverage && echo "$(BLUE)$(CC) $^$(WHITE)"

   BIO_data_read.o: $(PROJECT_SRC_DIR)/BIO/BIO_data_read.c 
    @$(CC) -o $@ -c $< -DTESTS $(P_CPPFLAGS) $(T_CPPFLAGS) --coverage && echo "$(BLUE)$(CC) $^$(WHITE)"

   BIO_main.o: $(PROJECT_SRC_DIR)/BIO/BIO_main.c
    @$(CC) -o $@ -c $< -DTESTS $(P_CPPFLAGS) $(T_CPPFLAGS) && echo "$(BLUE)$(CC) $^$(WHITE)"

   BIO_setparams.o: $(PROJECT_SRC_DIR)/BIO/BIO_set_params.c
    @$(CC) -o $@ -c $< -DTESTS $(P_CPPFLAGS) $(T_CPPFLAGS) && echo "$(BLUE)$(CC) $^$(WHITE)"

   BIO_version_nr_read.o: $(PROJECT_SRC_DIR)/BIO/BIO_version_nr_read.c
        @$(CC) -o $@ -c $< -DTESTS $(P_CPPFLAGS) $(T_CPPFLAGS) && echo "$(BLUE)$(CC) $^$(WHITE)"

   BIO_high_param_read.o: $(PROJECT_SRC_DIR)/BIO/BIO_high_param_read.c
        @$(CC) -o $@ -c $< -DTESTS $(P_CPPFLAGS) $(T_CPPFLAGS) && echo "$(BLUE)$(CC) $^$(WHITE)"        

   tbio.o: $(TEST_SRC_DIR)/T_bio.cpp
    @$(CP) -o $@ -c $< $(T_CPPFLAGS) $(P_CPPFLAGS) && echo "$(BLUE)$(CP) $^$(WHITE)"

   # MAIN
   main.o: $(TEST_SRC_DIR)/main.cpp
    @$(CP) -o $@ -c $< $(P_CPPFLAGS) $(T_CPPFLAGS) && echo "$(BLUE)$(CP) $^$(WHITE)"

知道出了什么问题吗?

最佳答案

这是大小写错误,您的变量是 Grp_Para_loivariable_Data,但您的 extern 是 Grp_para_loivariable_Data,“para”上有一个小写 p

关于c - 海湾合作委员会 : linker error : undefined reference while using a constant data shared between two files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581826/

相关文章:

c - Strncmp:异常段错误

c++ - 如果链接时启用 "-ffast-math"会发生什么?

c - 如何确保结构在 GCC 中完全初始化(按名称)?

带有继承的 C++ 共享库

c - 从c中的另一个文件链接静态函数

C 读取文件行并打印它们

c - 如何预测 C 中特定数据类型的大小?

c - 如何接受并同时哑掉不需要的输入? (扫描)

c++ - GCC 如何处理内置函数

.net - 从 .Net v4.0 程序集链接到 .Net v2.0 程序集似乎也链接(和别名)mscorlib v2.0。为什么?