C++ 我试着打电话给c++;要从C文件运行到我的cpp文件,但出现一些错误:

C++ 我试着打电话给c++;要从C文件运行到我的cpp文件,但出现一些错误:,c++,c,C++,C,我有一个 c++ project dll type . 我在这个项目中添加/创建了一个名为it ENCODER.c的新项目/文件 在ENCODER.c中,我有一些功能,如: void init() { } void start() { } 现在我添加/创建了一个名为:ENCODER.h的新头文件 在这一次中,我做到了: namespace Encode { class Encode { public: static __declspec(dllexport)

我有一个

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

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();
    }

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

现在在做了所有这些之后,我得到了两个错误:

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

  • LNK1120:1个未解析的外部


  • 首先,您需要
    declspec(export)
    整个类,但这比使用类时需要
    declspec(import)
    更复杂。在构建库时使用以下宏并定义
    构建\u MYLIBRARY
    (并确保在使用库时未定义)

    然后像这样使用它:

    class MYLIBRARY_EXPORT Encode
    {
        ...
    };
    

    接下来确保C++所能看到的任何C函数都被声明为代码>外部“C”<代码>,以关闭名称的限制(技术C++用于允许函数重载)。因此,为C函数创建一个头(<代码>编码器.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\u EXPORT
    是可选的;这取决于是否要从
    .dll
    公开它们)。在实现它们时,只要编译器已经看到头文件,就不需要
    外部“C”
    MYLIBRARY\u EXPORT
    ,所以要包括它:

    #include "ENCODER.h"
    
    void init()
    {
        ...
    }
    
    void start()
    {
        ...
    }
    

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

    我现在尝试将H头文件代码更改为:namespace Encode{extern“C”{class Encode{public:static u declspec(dllexport)void init();}},但错误相同。可能问题是在头文件中我没有使用void init()?我需要澄清一些事情。#ifdef BUILDING#u MYLIBRARY所有这部分我都放在c文件中头文件还是cpp文件?第二个类MYLIBRARY\u导出编码我在cpp文件中使用它?我试图使用它,但在我使用的任何地方,我在MYLIBRARY_导出时都遇到一个错误,错误是:未知属性“import”那么,编码器.c文件到底是什么?你是说要创建一个新的c文件还是我现在已经拥有的一个带有函数的c文件?是的,
    构建我的库
    宏定义应该包含在一个头文件中,并且包含从
    .dll
    导出的符号。如果需要是类和函数声明的一部分(即在头文件中),则不是定义或实现文件。
    #pragma once
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    void MYLIBRARY_EXPORT init();
    void MYLIBRARY_EXPORT start();
    
    #ifdef __cplusplus
    }    // extern "C"
    #endif
    
    #include "ENCODER.h"
    
    void init()
    {
        ...
    }
    
    void start()
    {
        ...
    }