来自静态指针的未定义的函数引用

时间:2015-04-17 21:43:15

标签: c++ eclipse c++11 eclipse-cdt

我正在试验运行时的dll加载,我遇到了一个问题:我有一个辅助类,它在主程序中是istanciated。指向此对象的指针将传递给加载的dll。为了测试它,我想从类(printLine)调用一个函数。但我无法编译dll,因为我得到了一个:

Utility.o: In function `ZN7Utility6onInitEv':
D:\Benutzer\Jan\Desktop\Programmierprojekte\Game Engine 5.0\Utilities\Debug/../Utility.cpp:7: undefined reference to `ModuleHelper::printLine(std::string)'
collect2.exe: error: ld returned 1 exit status

这两个文件是dll的唯一内容:

Utility.h:

#ifndef UTILITY_H_
#define UTILITY_H_

#include <iostream>
#include <Definitions.h>
#include <ModuleHelper.h>

class Utility
{
public:
    Utility();
    ~Utility();

    static void onInit();
    static void onUpdate();

    static char* getName();
    static char** getDependencies();
    static int getCountDependencies();
    static char* getServeAs();

    static void setModuleHelper(ModuleHelper* helper);

private:
    static constexpr char* name = "Utility";
    static constexpr char** dependencies = nullptr;
    static constexpr int countDependencies = 0;
    static constexpr char* serveAs = "";
    static ModuleHelper* moduleHelper;
};

extern "C" //GAME_API is a dllexport macro
{
    char* GAME_API getName()
    {
        return Utility::getName();
    }

    char** GAME_API getDependencies()
    {
        return Utility::getDependencies();
    }

    int GAME_API getCountDependencies()
    {
        return Utility::getCountDependencies();
    }

    char* GAME_API getServeAs()
    {
        return Utility::getServeAs();
    }

    noargfunc GAME_API onInit()
    {
        return Utility::onInit;
    }

    noargfunc GAME_API onUpdate()
    {
        return Utility::onUpdate;
    }

    void GAME_API setModuleHelper(ModuleHelper* moduleHelper)
    {
        Utility::setModuleHelper(moduleHelper);
    }
}
#endif /* UTILITY_H_ */

Utility.cpp:

#include "Utility.h"

ModuleHelper* Utility::moduleHelper; //with "= nullptr" or "= NULL" it didn't work either

void Utility::onInit()
{
    moduleHelper->printLine("Hello from Utilities"); //wrapper for std::cout
}

void Utility::onUpdate()
{

}

char* Utility::getName()
{
    return name;
}

char** Utility::getDependencies()
{
    return dependencies;
}

int Utility::getCountDependencies()
{
    return countDependencies;
}

char* Utility::getServeAs()
{
    return serveAs;
}

void Utility::setModuleHelper(ModuleHelper* helper)
{
    moduleHelper = helper;
}

1 个答案:

答案 0 :(得分:2)

未定义的引用意味着找不到IMPLEMENTATION。

看起来您只是包含头文件才能使用该库。

主要问题(链接器错误 - 不是运行时!)是您可能忘记链接库。 (Visual Studio中的项目引用)

无论如何,如果您可以编译并链接代码,您将发现下一个错误。

ModuleHelper* Utility::moduleHelper; //with "= nullptr" or "= NULL" it didn't work either

如果用NULL初始化moduleHelper,然后用&#34; - &gt;&#34;取消引用指针试图做某事你会得到一个空指针异常。 你必须初始化它...(可能是=新的ModuleHelper)。由于我不知道使用过的库,您必须自己阅读文档。