无法解析的外部符号(如何在cpp文件中将变量定义为dll)

时间:2019-04-23 20:48:18

标签: c++ linker

我有一个与问题无关的小部件库,但这是链接器出现问题的原因。

我在cpp文件中定义了几个静态变量。我将项目构建为DLL,并且在尝试调用函数时在另一个项目中,它会引发“未解析的外部符号”错误。

如何在cpp文件中定义这些静态变量,并使链接器不引发“未解析的外部符号”错误?在标头中定义它们并包括该标头时,这种方法可以很好地工作,但我想在cpp文件中定义它们。

3个static const widget_style变量是在cpp文件中定义的变量:

// default frame native to the os
class JOSZVA_DLL frame : public base::register_class<frame_class>, 
    public base::widget
{
public:
    // containing frame only styles, definitions can be found in style_list.cpp
    class JOSZVA_DLL styles
    {
    public:
        static const style::widget_style frame_default;
        static const style::widget_style caption;
        static const style::widget_style resizable;
    };

public:
    // create a frame with a specified title, parent frame (optional), style (optional)
    frame(const std::string title, widget* parent = nullptr, style::widget_style style = styles::frame_default);
    // create a frame with a custom widget_class, allows for more customization
    frame(const base::widget_class, const std::string title, widget* parent = nullptr, style::widget_style style = styles::frame_default);
    ~frame();

private:
    // set up the frame
    void initialize(const std::string title);
};

这是cpp文件:

#include <gui/base/widget.h>
#include <gui/style/widget_style.h>
#include <gui/widgets/frame.h>

/* this file contains all the definitions of every possible widget style
this includes the base widget styles and individual widget styles */

// in this case it is completely fine to be using namespaces as all the definitions of each widget style belong in here
using namespace joszva::creator::gui::base;
using namespace joszva::creator::gui::style;
using namespace joszva::creator::gui::widgets;

// widget base styles
const widget_style widget::styles::visible = widget_style(WS_VISIBLE, 0);
const widget_style widget::styles::client_edge = widget_style(0, WS_EX_CLIENTEDGE);

// frame styles
const widget_style frame::styles::frame_default = widget_style(WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0);

因此,如您所见,所有内容都已定义,但是在构建使用DLL的其他项目时,它将引发“无法解析的外部符号”错误,表明styles中的所有内容均未定义。

更新:这个问题与标记的方式非常相似。如前所述,我正在构建DLL,并且想知道如何在DLL中的cpp文件中定义符号。它与标记为不同。

0 个答案:

没有答案