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

Linker error when Including own resource files in dll project Microsoft Visual studio 2015

我正在尝试使用 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文件作为资源文件包含在工程中。当我编译它时,我得到链接器错误,因为来自 function1.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

我的functions1.h和我的functions2.h只是声明和定义了各种不同函数的头文件。

landscape.h和model.h被MVS2015在external dependencies文件夹中找到,可以包含进来。如果我编译,找不到 cpp 文件中的方法定义。如果我将它们添加为资源文件,可以找到方法,但会出现链接器错误,指出来自 myfunctions1.h 和 myfunctions2.h 的函数在 model.obj 和 landscape.obj 中定义.

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

myfunctions1.h and myfunctions2.h are only header files in which various different functions are declared and defined... but a linker error occurs saying that the functions from myfunctions1.h and myfunctions2.h are defined in model.obj and landscape.obj.

这听起来像是在两个头文件 myfunctions1.h 和 myfunctions2.h 中声明和定义的函数没有被声明为 inline 因此它们可以在每个目标文件中找到,头文件是included in。这相当于把cpp文件include到头文件中。

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