我遇到了链接器错误:
duplicate symbol __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv in:
Read.cpp.o
Material.cpp.o
当重复的符号名称为:
$ c++filt __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv
ENDF6::File<(ENDF6::MF_enum)1>::read()
我知道在多个地方定义相同的函数会导致链接错误。这是可能会发生的情况。(我看到了这个问题:ld: duplicate symbol) 我不认为我在多个地方定义了
read()
函数,但链接器(clang++
)却说我有。我的代码结构如下:
//MFs.hpp
#ifndef MFS_HPP
#define MFS_HPP
enum class MF_enum {
...
}
#endif
//File.hpp
#ifndef FILE_HPP
#define FILE_HPP
#include "MFs.hpp"
// Definition of class File
template<>
class File {
...
}
// Definition of File<...>::read() function
template <>
void File<1>::read()
{
std::cout << "Reading into MF=1"<< std::endl;
}
#endif
File.cpp
不存在,因为File
类是一个模板类。所有的定义(和声明)都在File.hpp
中。
// Material.cpp
#include "File.hpp"
...
// Material.hpp
#ifndef MATERIAL_HPP
#define MATERIAL_HPP
#include "File.hpp"
...
#endif
最后是驱动程序代码:
// Read.cpp
#include "Material.hpp"
#include "File.hpp"
int main (){
...
}
File<1>::read()
?如果是的话,你需要将该特化标记为inline
(完全特化不再是模板,而是一个函数。[实际上定义read
函数是这个问题的核心,它不应该被隐藏在注释中:// Definition of File<...>::read()
!!!] - David Rodríguez - dribeasread()
函数的声明和实现?如果是(且该函数没有被内联),可能会导致链接错误。 - Mine