【问题标题】:g++ linker is unable to locate functions despite header inclusion [duplicate]尽管包含标头,g ++链接器仍无法定位函数[重复]
【发布时间】:2018-01-14 03:19:13
【问题描述】:

我有 4 个文件 world.cpp, world.hpp, Helpers/tools.cpp, Helpers/tools.hpp。

wrold.cpp 和 tools.cpp 包含各自的头文件,world.hpp 包含 tools.hpp

world.hpp/cpp 使用 tools.hpp/cpp 中定义的结构

在我添加的 CMake 文件中

target_sources(voxel-world PUBLIC ${PROJECT_SOURCE_DIR}/Helpers/tools.cpp)

target_sources(voxel-world PUBLIC ${PROJECT_SOURCE_DIR}/World.cpp)

因此,据我所知,生成的 make 文件应该尝试正确链接所有内容。

但是,当我尝试编译我的程序时,我收到了错误消息:

    CMakeFiles/voxel-world.dir/source/World.cpp.o: In function `Chunk_Holder::Chunk_Holder()':
    World.cpp:(.text+0x112a): undefined reference to `cirArray<cirArray<cirArray<Chunk*> > >::cirArray()'
    CMakeFiles/voxel-world.dir/source/World.cpp.o: In function `Chunk_Holder::Chunk_Holder(int, int, int, World*)':
    World.cpp:(.text+0x117c): undefined reference to `cirArray<cirArray<cirArray<Chunk*> > >::cirArray()'
    World.cpp:(.text+0x11a2): undefined reference to `cirArray<cirArray<cirArray<Chunk*> > >::cirArray(unsigned int)'
    World.cpp:(.text+0x11ee): undefined reference to `cirArray<cirArray<Chunk*> >::cirArray(unsigned int)'
 ...
 ...

我不确定为什么链接器找不到这些声明,因为包含语句在每个文件上。我错过了什么?

【问题讨论】:

  • 并且 cirArray 的定义包含在标题中(不仅仅是声明)?
  • 当我们说“定义”时,我假设我们在谈论每个函数头的实现,是吗?

标签: c++ compiler-errors cmake linker


【解决方案1】:

问题是因为cirArray是一个模板类,如果实现在.cpp文件中,显然编译器无法生成相关代码。

因此,解决方案是将类实现移动到标题中。

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多