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()関数を実行/アクティブ化します!!

すべてを行った後、2つのエラーが発生します。

  1. LNK2019: 未解決の外部シンボル "public: static void __cdecl Encode::Encode::init(void)" (?init@Encode@1@SAXXZ) が関数 _myinit で参照されています

  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 関数が、名前マングリング(関数のオーバーロードを許可するために C++ が使用するテクノロジ)extern "C"を無効にするように宣言されていることを確認します。そのため、次のように C 関数のヘッダー ( ) ファイルを作成し、これらの関数を使用する C++ 実装ファイルにヘッダー ファイルを含めます。ENCODER.h

#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()とはstartEncoder()どうでしょうか。

于 2013-04-26T06:42:15.733 に答える