【问题标题】:Redefined symbol in multiple c code with #ifndef directive使用 #ifndef 指令在多个 c 代码中重新定义符号
【发布时间】:2017-10-23 14:22:48
【问题描述】:

我有一个愚蠢的问题,我不知道它是从哪里来的。我注意使用#ifndef 指令来确保我所有的#include 都没有被重新定义。可悲的是,他们中的三个正在发生这种情况。这是我的多个文件拱门:

t_include.h

#ifndef T_INCLUDE_H_
#define T_INCLUDE_H_

/* Project specific dependencies*/
#include "utilities.h"
#include "fsp_function.h"

#include "ti/csl/csl_tsc.h"
#include "ti/csl/csl_cache.h"
#include "ti/csl/csl_cacheAux.h"

#include "ti_sp_complex_convolution_A_input1.h"
#include "ti_sp_complex_convolution_A_input2.h"
#include "to_sp_complex_convolution_A_output.h"

#endif /* T_INCLUDE_H_ */

t_function.h

#ifndef T_FUNCTION_H_
#define T_FUNCTION_H_

#include "t_include.h"

/*output vector*/
#define INPUT1A_LENGTH  5000
#define INPUT2A_LENGTH  2800
#define OUTPUTA_LENGTH  2202
extern FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];

/*misc parameter*/
#define CPU_CLOCK_KHZ           1400000
#define CPU_CLOCK_MS            1/CPU_CLOCK_KHZ
#define FIR_NB_MACS             INPUT1A_LENGTH * OUTPUTA_LENGTH     /*   FIR algorithm complexity */
#define NB_OF_REP               10
#define UMA_L2CACHE_L1DCACHE    0

/* Project specific types */
typedef struct{
ect...

现在 c 文件只包含 t_function.h :

t_function.c

/* Dependencies */
#include "t_function.h"
FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];
/* API  */
etc...

还有 t_main_function.c

/* dependencies */
#include "t_function.h"
void main(void) {
etc...

它应该可以工作,但在此处链接期间出现错误:

<Linking>
error #10056: symbol "sp_complex_convolution_A_output" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"
error #10056: symbol "sp_complex_convolution_A_input2" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"
error #10056: symbol "sp_complex_convolution_A_input1" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"

error #10056: symbol "sp_complex_convolution_A_output_thales" redefined: first defined in "./TEST/t_function.obj"; redefined in "./TEST/t_main_function.obj"
>> Compilation failure
error #10010: errors encountered during linking; "CONVOLUTION_COMPLEX.out" not built

因此错误仅来自三个符号 sp_complex_convolution_A_output、sp_complex_convolution_A_input1 和 sp_complex_convolution_A_input2,它们在自己的 .h 中定义,也受 #ifndef 指令保护:

ti_sp_complex_convolution_A_input1.h

#ifndef __TI_SP_COMPLEX_CONVOLUTION_A_INPUT1_H_
#define __TI_SP_COMPLEX_CONVOLUTION_A_INPUT1_H_

FLOAT32 sp_complex_convolution_A_input1[2 * 2500] = {
etc... 

另外两个也一样……

所以我真的不知道为什么会这样。 感谢您的帮助

【问题讨论】:

    标签: c include directive defined ifndef


    【解决方案1】:

    定义如下:

    FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];
    

    应该进入源文件。

    头文件应该只包含如下声明:

    extern FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];
    

    根据经验,不要将任何分配内存的内容放入头文件中。

    【讨论】:

    • 实际上在我尝试更改很多东西以使其正常工作之前就是这样,我同意这肯定是外部定义。顺便说一句,这添加了一个错误:未解析的符号 sp_complex_convolution_A_output_thales,首先在 ./TEST/t_function.obj 中引用
    • @ThéophileLeroy extern 表示:它是在其他地方定义的。那么它是在哪里定义的呢?
    • 在 t_function.c 中通常是:t_function.c : FLOAT32 sp_complex_convolution_A_output_thales[OUTPUTA_LENGTH];其他三个 .h 的问题仍然存在,它们是三个参考向量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2012-12-27
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多