gpt4 book ai didi

c++ - ld : duplicate symbol

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:08 26 4
gpt4 key购买 nike

我有 rand.cpp 和 rand.hpp 文件,并且有 rand_unif() 函数。我在 sim_engine.hpp 文件中包含了 rand.hpp 文件。

在 main.cpp 文件中,我包含了 sim_engine.hpp 文件。如果我运行 makefile 然后我得到这个错误

ld: duplicate symbol rand_unif()    in sim_engine.o and main.o for architecture x86_64
collect2: ld returned 1 exit status

sim_engine.hpp 是唯一包含 rand.hpp 的地方。main.cpp 不包含 rand.hpp 但包含 sim_engine.hpp。

我不明白为什么会出现重复符号错误。

#mod_simu.make project makefile

mod_simu : main.o rand.o graph.o street.o isection.o vehicle.o event.o FEL.o sim_engine.o clock.o
g++ -o mod_simu main.o rand.o graph.o street.o isection.o vehicle.o event.o FEL.o sim_engine.o clock.o

main.o : main.cpp
g++ -c main.cpp

rand.o : rand.cpp
g++ -c rand.cpp

graph.o : graph.cpp graph.hpp street.hpp isection.hpp
g++ -c graph.cpp

street.o : street.cpp street.hpp
g++ -c street.cpp

isection.o : isection.cpp isection.hpp street.hpp
g++ -c isection.cpp

vehicle.o : vehicle.cpp vehicle.hpp
g++ -c vehicle.cpp

event.o : event.cpp event.hpp
g++ -c event.cpp

FEL.o : FEL.cpp FEL.hpp
g++ -c FEL.cpp

sim_engine.o : sim_engine.cpp sim_engine.hpp
g++ -c sim_engine.cpp

clock.o : clock.cpp clock.hpp
g++ -c clock.cpp
clean:
rm *.o mod_simu

#end

这是我的生成文件。

最佳答案

您显然在程序中多次定义了 rand_unif。您可能只在文本代码中定义它一次,但通过 header 包含,该代码被编译成多个 .o 文件。

您可能在 rand.hpp 中定义了 rand_unif。该 header 包含在 sim_engine.hpp 中,因此任何包含 sim_engine.hpp 的 .cpp 文件都将自动获得 rand_unif 的拷贝。显然,main.cppsim_engine.cpp 都包含 sim_engine.hpp,所以这两个 .o 文件都得到了函数的拷贝。 C++ 禁止对同一函数进行多个定义,但它不需要强制执行该要求。 (它被称为单一定义规则。)链接器捕获了你。

该问题有两种典型的解决方案:

  • 将函数的定义移动到.cpp 文件中; rand.cpp 似乎是个不错的选择。确保 rand.hpp 仅包含声明,而不包含定义。

  • 将头文件中的定义更改为内联。 C++ 对内联函数的单一定义规则做了一个异常(exception)。在 rand.hpp 中的声明之前添加 inline

关于c++ - ld : duplicate symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9299676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com