我有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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这是我的makefile.
您rand_unif在程序中已经多次明确定义了.您可能只在文本代码中定义一次,但通过包含头,该代码被编译为多个.o文件.
您可能rand_unif在rand.hpp中定义.包含的标头包含在sim_engine.hpp中,因此任何包含sim_engine.hpp的 .cpp文件都会自动获得rand_unif.显然,这两种的main.cpp和sim_engine.cpp包括sim_engine.hpp,所以这两个的.o文件得到函数的副本.C++禁止具有相同功能的多个定义,但不要求强制执行该要求.(它被称为单定义规则.)链接器已经抓住了你.
这个问题有两种典型的解决方案:
将函数的定义移动到.cpp文件中; rand.cpp似乎是一个很好的候选人.确保rand.hpp仅包含声明,而不包含定义.
将头文件中的定义更改为内联.C++对内联函数的单定义规则进行了例外处理.inline在rand.hpp中声明之前添加.