我有rand.cpp和rand.hpp文件,并具有rand_unif()函数。
我已将rand.hpp文件包含在sim_engine.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。您可能只在文本代码中定义了一次,但是通过包含 header ,该代码被编译成多个.o文件。

您可能在rand.hpp中定义了rand_unif。包含的 header 包含在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++排除了一个定义规则的异常(exception)。在rand.hpp中的声明之前添加inline
  • 关于c++ - ld : duplicate symbol,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9299676/

    10-12 19:17