尽管在我的 .h 文件中使用了 `#ifndef #define #endif` 代码块,但为什么我会收到这么多 `LNK2005` 错误?

Why do I get so many `LNK2005` errors despite using `#ifndef #define #endif` code blocks in my .h files?

我有 21 个文件,如图所示:

以下 35 个函数在 util.h 的第 364-411 行中声明在

#ifndef FlagUtil

#define FlagUtil

#endif  

代码块:

Create_Pix, Remove_Pix, my_round, edit_error, check_file, check_dir, 
read_config, write_config, write_envi_config, my_randomize, my_random, 
my_eps_random, cadd, csub, cmul, cdiv, cpwr, cconj, cimg, crel, cmod, cmod2, 
angle, cplx_sinc, PolTypeConfig, init_file_name, memory_alloc, PrintfLine, 
CreateUsageHelpDataFormat, CreateUsageHelpDataFormatInput, 
init_matrix_block, block_alloc, CheckFreeMemory, CheckFreeMemoryWin32, 
CheckFreeMemoryLinux  

以下 30 个函数在 util_block.h 的第 99-135 行中声明在

#ifndef FlagUtilBlock

#define FlagUtilBlock

#endif  

代码块:

read_matrix_int, read_matrix_float, read_matrix_cmplx, write_matrix_int, 
write_matrix_float, write_matrix_cmplx, read_matrix3d_float, 
read_matrix3d_cmplx, write_matrix3d_float, write_matrix3d_cmplx, 
read_block_matrix_int, read_block_matrix_float, 
read_block_matrix_matrix3d_float, read_block_matrix_cmplx, 
write_block_matrix_int, write_block_matrix_float, 
write_block_matrix_matrix3d_float, write_block_matrix_cmplx, 
write_block_matrix3d_float, write_block_matrix3d_cmplx, read_block_S2_avg, 
read_block_S2_noavg, read_block_S2T6_avg, read_block_SPP_avg, 
read_block_SPP_noavg, read_block_TCI_avg, read_block_TCI_noavg, 
read_block_S2_TCIelt_noavg, read_block_SPP_TCIelt_noavg, average_TCI  

以下 35 个函数在 util_convert.h 的第 106-149 行中声明在

#ifndef FlagUtilConvert

#define FlagUtilConvert

#endif  

代码块:

S2_to_C3elt, S2_to_C4elt, S2_to_T3elt, S2_to_T4elt, S2_to_T6elt, 
SPP_to_C2elt, SPP_to_T2elt, S2_to_SPP, S2_to_IPP, S2_to_C2, S2_to_C3, 
S2_to_C4, S2_to_T2, S2_to_T3, S2_to_T4, S2_to_T6, SPP_to_C2, SPP_to_T2, 
SPP_to_IPP, SPP_to_T4, C2_to_IPP, C2_to_T2, T2_to_C2, C4_to_T4, C4_to_C3, 
C4_to_T3, C4_to_C2, C4_to_IPP, T4_to_C4, T4_to_C3, T4_to_T3, C3_to_T3, 
C3_to_C2, C3_to_IPP, T3_to_C3, T6_to_C3  

而文件PolSARproLib.h的内容是:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#ifdef _WIN32
#include <dos.h>
#include <conio.h>
#endif

/* ROUTINES DECLARATION */
#include "util.h"
#include "util_block.h"
#include "util_convert.h"
#include "graphics.h"
#include "matrix.h"
#include "processing.h"
#include "statistics.h"
#include "sub_aperture.h"
#include "my_utils.h"  

而文件PolSARproLib.c的内容是:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>

#ifdef _WIN32
#include <dos.h>
#include <conio.h>
#endif

/* ROUTINES DECLARATION */
#include "util.c"
#include "util_block.c"
#include "util_convert.c"
#include "graphics.c"
#include "matrix.c"
#include "processing.c"
#include "statistics.c"
#include "sub_aperture.c"
#include "my_utils.c"  

我已将这 21 个文件放在名为 Static Project 的文件夹中,并按如下方式创建了 PolSARproLib.lib 文件,我的机器是 Win 10x64:(here我已经上传了这个项目):

文件 graphics.objmatrix.objmy_utils.objPolSARproLib.libPolSARproLib.objprocessing.objstatistics.obj、[ =38=、util.objutil_block.objutil_convert.obj在项目的Debug文件夹中创建,没有任何错误,但有一些警告,如:

1>graphics.obj : warning LNK4006: _write_header_bmp_8bit already defined in 
PolSARproLib.obj; second definition ignored  

我创建了一个名为 Arii 的文件夹,并将以下 22 个文件放入子文件夹 \Arii\lib

我还有文件 arii_anned_3components_decomposition.c 放在文件夹 Arii 中:

现在我在文件夹Arii中创建项目arii_anned_3components_decomposition如下(here我已经上传了项目)

在下面2张图片中,您可以看到项目的配置。再一次,我应该说我正在使用 Win 10x64 机器

项目中添加外部库如下:

Properties>C/C++>General>Additional Include directories

我输入放置头文件.h的文件夹路径

Properties>Linker>General>Additional library directories  

我输入放置.lib个文件的文件夹路径

Properties>Linker>Input>Additional Dependencies

我已经输入了需要的 .lib 个文件的名称:

这是文件的开头(在 main 函数之前)arii_anned_3components_decomposition.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#include "omp.h"

#ifdef _WIN32
#include <dos.h>
#include <conio.h>
#endif

/* ROUTINES DECLARATION */
#include "../lib/PolSARproLib.h"  

现在我构建解决方案:

不幸的是我得到了 104 个错误。其中100个是关于util.hutil_convert.hutil_block.h中函数的多重定义(这些函数列在问题的开头)

错误 1-100 相似:

1>PolSARproLib.lib(PolSARproLib.obj) : error LNK2005: _C3_to_T3 already 
defined in PolSARproLib.lib(util_convert.obj)    

Here 我上传了 error and warning file.txt

CoryKramer 所述,我们不需要文件 PolSARpro.c,事实上我们永远不应该 #include .cpp.c 文件和这是在该文件中所做的:

文件PolSARproLib.c的内容是:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>

#ifdef _WIN32
#include <dos.h>
#include <conio.h>
#endif

/* ROUTINES DECLARATION */
#include "util.c"
#include "util_block.c"
#include "util_convert.c"
#include "graphics.c"
#include "matrix.c"
#include "processing.c"
#include "statistics.c"
#include "sub_aperture.c"
#include "my_utils.c"  

因此,为了消除所有这 100 个 LNK2005 错误,只需将这 20 个文件(省略 PolSARproLib.c)放在一个文件夹中

然后按照创建和构建静态库项目 PolSARproLib.lib 文件以及创建和构建控制台应用程序项目 arii_anned_3components_decomposition.exe 文件的问题中所述执行后续步骤。