3

我有一个

c++ project dll type .

我在这个项目中添加/创建了一个名为 ENCODER.c 的新项目/文件,在 ENCODER.ci 中有一些功能,例如:

void init()
{
}

void start()
{
}

现在我添加/创建了一个名为它的新头文件:ENCODER.h

在这个我做了:

namespace Encode
{
    class Encode
    {
    public:
    static __declspec(dllexport) void init();
    };
}

然后在cpp文件中我做了:

#include <stdexcept>

using namespace std;
#include "stdafx.h"
#include "targetver.h"
#include "ENCODER.h"


extern "C" {
    void  myinit()
    {
        Encode::Encode::init();
    }

}

在cpp文件中我想要那个

Encode::Encode::init(); this init()

将执行/激活我在 C 文件中的 init() 函数!

现在,在完成所有这些之后,我遇到了两个错误:

  1. LNK2019:函数 _myinit 中引用的未解析外部符号“public:static void __cdecl Encode::Encode::init(void)”(?init@Encode@1@SAXXZ)

  2. LNK1120:1 个未解决的外部因素

4

1 回答 1

4

首先你需要declspec(export)整个类,但它比declspec(import)使用类时需要的更复杂。在构建库时使用以下宏并定义BUILDING_MYLIBRARY(并确保在使用库时未定义)

#ifdef BUILDING_MYLIBRARY
    #define MYLIBRARY_EXPORT __declspec(export)
#else
    #define MYLIBRARY_EXPORT __declspec(import)
#endif

然后像这样使用它:

class MYLIBRARY_EXPORT Encode
{
    ...
};

接下来确保 C++ 可以看到的任何 C 函数都声明extern "C"为关闭名称修改(C++ 使用该技术允许函数重载)。因此,为 C 函数创建一个头 ( ENCODER.h) 文件,如下所示,并将该头文件包含在任何希望使用这些函数的 C++ 实现文件中:

#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

void MYLIBRARY_EXPORT init();
void MYLIBRARY_EXPORT start();

#ifdef __cplusplus
}    // extern "C"
#endif

然后在单独的实现 ( ENCODER.c) 文件中实现这些函数(使用MYLIBRARY_EXPORT是可选的;这取决于您是否要从您的.dll. 实现它们时,只要编译器看到头文件,就不需要extern "C"或,所以包括它:MYLIBRARY_EXPORT

#include "ENCODER.h"

void init()
{
    ...
}

void start()
{
    ...
}

建议:选择更好的名字!该start()函数已经存在于 C 运行时库中,那么initEncoder()andstartEncoder()呢?

于 2013-04-26T06:42:15.733 回答