c-犯错误:..的多个定义..尽管包括警卫



我的编译器在函数的多个定义(或者特定.c文件中的所有函数)方面给了我一些非常奇怪的错误。

我正在使用include防护来防止多次声明

我的头文件不包含任何定义,只包含声明。文件中没有定义任何变量,只有函数。

我仔细检查了一下:只有.h文件包含在其他文件中。任何地方都没有包含.c文件。

我正在使用相同的方法来包括我的代码的其余部分,我在那里没有问题。正因为如此,我不能给出我的问题的最小例子,因为我看不到正在工作的文件和导致编译器问题的文件之间的(相关的)差异。

该错误是在git中合并两个分支后首次出现的。在合并之前,这两个分支中的每一个都在顺利编译。

目前,我很高兴能得到任何关于这个问题可能来自哪里的暗示。

如果有人需要,我也会提供我的代码和/或错误日志。这是一个相当长的代码,所以如果你需要它,请随时询问

来自make的错误消息是

错误消息

src/rhs.o: In function `calculate_rhs':
/home/user/Desktop/WS5/src/rhs.c:15: multiple definition of `calculate_rhs'
src/rhs.o:/home/user/Desktop/WS5/src/rhs.c:15: first defined here
src/rhs.o: In function `evaluate_rhs1':
/home/user/Desktop/WS5/src/rhs.c:103: multiple definition of `evaluate_rhs1'
src/rhs.o:/home/user/Desktop/WS5/src/rhs.c:103: first defined here
src/rhs.o: In function `evaluate_rhs2':
/home/user/Desktop/WS5/src/rhs.c:140: multiple definition of `evaluate_rhs2'
src/rhs.o:/home/user/Desktop/WS5/src/rhs.c:140: first defined here
collect2: error: ld returned 1 exit status
make: [exec] Error 1 (ignored)

rhs.o的编译器命令是

/usr/lib/petscdir/3.6.0/arch-linux2-c-debug/bin/mpicc -o src/rhs.o -c -fPIC -Wall -Wwrite-strings -Wno-strict-aliasing -Wno-unknown-pragmas -g3 -O0  -std=c99 -I/usr/lib/petscdir/3.6.0/include -I/usr/lib/petscdir/3.6.0/arch-linux2-c-debug/include    `pwd`/src/rhs.c

.h文件在这里:http://pastebin.com/Za37iWr7

.c文件在这里:http://pastebin.com/2mSzdZvT

上述.c文件和主要功能仅包含.h文件

所有其他包含的(由rhs.c)文件的头文件是:

  • gauss.h:http://pastebin.com/QSaTMRhk
  • global.h:http://pastebin.com/sMEkehWM
  • eval.h:http://pastebin.com/QjJAGSdf
  • 索引.h:http://pastebin.com/jHvtnvQh

生成文件:http://pastebin.com/LDj1e7xB

提前感谢:)

很可能您的makefile或构建脚本在合并中出错,并且它链接了同一个文件(rhs.o)两次。

问题出在make文件中。

注意:"all"应该是第一个目标,而不是第二个

注意:每个没有创建具有目标名称的文件的目标都应该包含在.PHONY:target 中

注意:宏应该用":="而不是"="来定义,因为"="会导致每次调用宏时都会重新评估宏,而":"会导致只评估宏一次。

注意:编写包含这样的依赖文件:

(扩展"ifneq"以包括"clean_all"、"cleaning"one_answers"clean_doc"

# wrap with ifneg... so will not rebuild *.d files when goal is 'clean_all', etc
#
ifneq "$(MAKECMDGOALS)" "clean_all"
-include $(OBJ:.o=.d)
-include $(TEST_OBJ:.o=.d)
endif

以下是问题的根源:

OBJ = $(SRC)/main.o
  $(SRC)/helper.o
  $(SRC)/init.o
  $(SRC)/basis.o
  $(SRC)/gauss.o
  $(SRC)/indices.o
  $(SRC)/eval.o
  $(SRC)/rhs.o     <-- first instance of rhs.o
  $(SRC)/visual.o
  $(SRC)/matrix.o
  $(SRC)/rhs.o      <-- second instance of rhs.o

这个规则:

exec:  $(OBJ) chkopts
    -$(CLINKER) -o sim $(OBJ) $(PETSC_KSP_LIB)

包含$(OBJ)的扩展,其中$(OBJ)包含上述错误

相关内容

  • 没有找到相关文章

最新更新