ld:重复符号

ld: duplicate symbol

本文关键字:符号 ld      更新时间:2023-10-16

我有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

这是我的makefile。

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

您可能在rand.hpp中定义了rand_unif。包含的标头由sim_engine.hpp包含,因此包含sim_engine.hpp<.em>的任何.cpp文件都将自动获得rand_unif的副本。显然,main.cppsim_engine.cpp都包含sim_engine.hppo文件都获得了函数的副本。C++禁止对同一函数有多个定义,但不要求强制执行该要求。(它被称为一个定义规则。)链接器已经抓住了你。

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

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

  • 将头文件中的定义更改为inline。C++对内联函数的一个定义规则进行了例外处理。在rand.hpp.中的声明之前添加inline

我的猜测是,您在代码中的某个地方包含了两次函数的声明。你可能想尝试用这个包装"rand.hpp"的所有包含:

#ifndef RAND_HP
#define RAND_HP
#include{文件路径}
#endif