在dll项目Microsoft Visual Studio 2015中包含自己的资源文件时链接器错误

时间:2016-02-03 13:58:32

标签: c++ dll visual-studio-2015 linker-errors

我正在尝试使用C ++使用Microsoft Visual Studio 2015构建一个dll文件。我不使用/ clr也不使用预编译头。我必须包含两个自己的头文件和c ++文件(例如model.h和cpp以及landscape.h和cpp)。两个文件都包含相同的头文件(例如functions1.h,functions2.h)。 model.h和landscape.h包含在dll.h中,相应的cpp文件作为资源文件包含在项目中。当我编译它时,我得到链接器错误,因为函数1.h和function2.h中包含的头文件的方法被包含多次。但是,如果我只在dll.h文件中包含这些头文件,则会出现编译器错误,因为这些头文件中定义的方法在model.h和landscape.h中是未知的。 我如何理解这个错误是每个资源文件都被编译成一个obj文件,并且链接器在两个obj文件中找到相同的方法,这会产生错误。但是我无法弄清楚如何解决这个问题。我很乐意为每一个帮助。 干杯 勒夫

嗯......也许我没有把我的问题弄清楚。我有一个用于dll项目的头文件和cpp文件

    //dllproject.h
#ifdef DLLFUNCTIONS
#define DLL_EXPORTS __declspec(dllexport)
#else
#define DLL_EXPORTS __declspec(dllimport)
#endif

#include <model.h>
#include <landscape.h>

using namespace std;

extern "C"
{
    namespace dll_Project
    {
        //export functions
    }
}

这里有相应的.cpp文件

//dllproject.cpp
#include "dllproject.h"

using namespace std;
extern "C"
{
    namespace dllproject
    {
        //export functions
    }
}

包含的model.h和landscape.h是自己的项目,其中不同的类,结构和函数是不同的,并且包括具有各种函数的其他头文件。在model.h中,包含了landscape.h,但是model.h不在landscape.h中。

//model.h
#pragma once
#include <myfunctions1.h>
#include <myfunctions2.h>
#include <landscape.h>

//declarations of classes and methods

和相应的cpp文件

//model.cpp
#include <model.h>

//definitions of the declared methods

类似于landscape.h文件

//landscape.h
#pragma once
#include <myfunctions1.h>
#include <myfunctions2.h>

//declaration of multiple classes and methods

和相应的cpp文件:

//landscape.cpp
#include <landscape.h>
//definitions of the declared methods

myfunctions1.h和myfunctions2.h只是头文件,其中声明和定义了各种不同的函数。

landscape.h和model.h由MVS2015在外部依赖项文件夹中找到,可以包含在内。如果我编译,则找不到cpp文件中的方法定义。如果我将它们添加为资源文件,则会找到这些方法,但会发生链接器错误,指出myfunctions1.h和myfunctions2.h中的函数是在model.obj和landscape.obj中定义的。

如果有人可以帮助我,我会很高兴。 干杯约阿希姆

1 个答案:

答案 0 :(得分:0)

  

myfunctions1.h和myfunctions2.h只是头文件,其中声明和定义了各种不同的函数......但是发生链接器错误,说myfunctions1.h和myfunctions2.h中的函数是在model.obj中定义的landscape.obj。

听起来两个头文件myfunctions1.h和myfunctions2.h中声明和定义的函数尚未声明为inline,因此可以在每个目标文件中找到包含头的文件。这相当于将cpp文件包含在头文件中。

在头文件中声明函数时,将它们声明为inline或在匿名命名空间中声明它们。在使用extern "C"的情况下,inline在这种情况下可能更为可取。