ld:重复符号
ld: duplicate symbol
我有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.cpp和sim_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
- LD:尝试编译项目时找不到架构x86_64符号
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- /usr/bin/ld: /tmp/cc9zxSDP.o: 对符号的未定义引用
- 编译问题LD:不满意的符号
- ld:Xcode 中架构x86_64的 1 个重复符号
- MacOS LD:找不到符号(x86_64)
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX CGGetActiveDisplayList -> ld:找不到体系结构x86_64的符号
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 英特尔 MKL 和 JNI:如何添加 ld 从中搜索符号的共享库?
- GCC LD:构造I386找不到符号
- 尽管存在符号链接,但 ld 无法加载库
- 无法导出mexfunction:符号未定义的collect.exe2.exe:错误:ld返回1退出状态
- ld:对于架构x86_64 row :: AddColumn找不到的符号
- GCC:Get LD:对于架构X86_64在OS X 10.11.5上找不到的符号
- ld:1 个重复符号用于架构x86_64 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 体系结构x86_64的未定义符号;ld:找不到体系结构x86_64的符号