将枚举与CMake链接的正确方法是什么?

时间:2019-08-17 07:09:05

标签: c++ visual-studio cmake

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

#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基础结构           $ {ALL_LIBS}           )

更新并显示确切的错误消息:

  

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

我认为这与我在cmake中未正确设置某些内容有关。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

LNK2019错误消息与您的枚举类无关。

该错误消息表明您没有BufferMode bufferMode(void)的公用方法VertexBuffer的定义。您只声明了它,但从未添加它的实现。
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)添加缺少的定义。

包含注释的整个错误消息:

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