尽管在我的 .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.obj
、matrix.obj
、my_utils.obj
、PolSARproLib.lib
、PolSARproLib.obj
、processing.obj
、statistics.obj
、[ =38=、util.obj
、util_block.obj
、util_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.h
、util_convert.h
、util_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
- 我真的不明白为什么我会收到这些关于代码块
#ifndef #define #endif
已在
代码?
如 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
文件的问题中所述执行后续步骤。
我有 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.obj
、matrix.obj
、my_utils.obj
、PolSARproLib.lib
、PolSARproLib.obj
、processing.obj
、statistics.obj
、[ =38=、util.obj
、util_block.obj
、util_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.h
、util_convert.h
、util_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
- 我真的不明白为什么我会收到这些关于代码块
#ifndef #define #endif
已在 代码?
如 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
文件的问题中所述执行后续步骤。