【问题标题】:What is the proper way to link enums with CMake? [closed]将枚举与 CMake 链接的正确方法是什么? [关闭]
【发布时间】:2019-08-17 07:09:05
【问题描述】:

我添加到我的 cmake (3.14) 项目中的新枚举类出现链接器错误 (LNK2019)。单独地,项目在 VS 中编译,但在链接主 exe 时失败。 这是枚举定义:

#ifndef VERTEXBUFFERMODE_H
#define VERTEXBUFFERMODE_H

enum class BufferMode
{
    SingleCopy,
    InstanceCopy
};

#endif

我可以通过像这样实例化我的枚举来修复它:

#ifndef VERTEXBUFFERMODE_H
#define VERTEXBUFFERMODE_H

enum class BufferMode
{
    SingleCopy,
    InstanceCopy
} BuffMode;

#endif 

但是,我收到链接器警告 LNK4006,它已经定义。虽然链接成功,但我宁愿没有它。 在我的 CMakeLists.txt 中,我链接了定义枚举的项目(Core.Graphics):

target_link_libraries(ExperimentalEngine Core.Graphics Infrastructure ${ALL_LIBS} )

更新准确的错误信息:

严重性代码描述项目文件行抑制状态 错误 LNK2019 无法解析的外部符号“public: enum BufferMode __cdecl VertexBuffer::bufferMode(void)" (?bufferMode@VertexBuffer@@QEAA?AW4BufferMode@@XZ) 中引用 函数“私有:void __cdecl VertexArray::drawArrays(class 顶点缓冲区 *)" (?drawArrays@VertexArray@@AEAAXPEAVVertexBuffer@@@Z) ExperimentalEngine C:\work\temp\experimentalengine\Core.Graphics.lib(VertexArray.obj) 1

我相信这与我没有在 cmake 中正确设置某些内容有关。有什么想法吗?

【问题讨论】:

  • 您需要显示准确的错误消息,而不仅仅是数字/ID。
  • 我已经用错误信息更新了它

标签: c++ visual-studio cmake


【解决方案1】:

LNK2019 错误信息与你的枚举类无关。

错误消息表明您没有对 VertexBuffer 的公共方法 BufferMode bufferMode(void) 的定义。您只声明了它,但从未添加它的实现。
(public: enum BufferMode __cdecl VertexBuffer::bufferMode(void))。

并且发生错误是因为drawArrays 尝试使用bufferMode
(referenced in function "private: void __cdecl VertexArray::drawArrays(class VertexBuffer *))

写作:

enum class BufferMode
{
    SingleCopy,
    InstanceCopy
} BuffMode;

没有修复LNK2019 错误,它引入了一个新错误。所以将} BuffMode; 恢复为};。并为bufferMode(void) 添加缺少的定义。

用 cmets 构造的整个错误信息:

Error LNK2019 
 unresolved external symbol 
   "public: enum BufferMode __cdecl VertexBuffer::bufferMode(void)" // human readable version of the name
          (?bufferMode@VertexBuffer@@QEAA?AW4BufferMode@@XZ) // mangled version of the name above
 referenced in function 
   "private: void __cdecl VertexArray::drawArrays(class VertexBuffer *)" // human readable version of the name
          (?drawArrays@VertexArray@@AEAAXPEAVVertexBuffer@@@Z)  // mangled version of the name above
 ExperimentalEngine  
    C:\work\temp\experimentalengine\Core.Graphics.lib
        (VertexArray.obj)  // the translation unit for which the error occured
    1

【讨论】:

  • 对!我错过了定义它。感谢您的详细回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2018-08-05
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多