9

API のエラーの場所:

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int CAnyseeUSBTVControllerDlg::InitCaptureDevice()
{

私の .h ライブラリ クラスと関数定義では:

class CAnyseeUSBTVControllerDlg : public CDialog
{
// Construction
public:
    int InitCaptureDevice(void);

それを解決する方法はありますか?

「エラー 1 エラー C2375: 'CAnyseeUSBTVControllerDlg::InitCaptureDevice': 再定義; 別のリンケージ c:\Program Files\toATS_DVS\anysee\anyseee30\anyseee30\anyseeUSBTVControllerDlg.cpp 122 anyseee30」

4

6 に答える 6

6

ヘッダーファイルで同じ宣言を使用していることを確認する必要があります。それ以外の場合は、別の方法と見なされます。

class CAnyseeUSBTVControllerDlg : public CDialog
{
// Construction
public:
    int InitCaptureDevice(void);
    DLLEXPORT int CaptureDevice(void);

C++クラスでのdllimportとdllexportの使用を参照してください。

于 2010-09-09T13:54:59.130 に答える
2

DLLEXPORTファイルに記述でき.cppますが、ヘッダーファイルには記述できません(そうでない場合、コンパイラーはこれらの関数を異なる関数として扱うため)。

あなたの定義も作ってくださいDLLEXPORT

于 2010-09-09T13:55:16.773 に答える
2

これは、次の理由で発生する可能性があります。

  1. 関数のプロトタイプをさまざまな場所で異なる可視性 ( externvs static)で定義しました
  2. 上記と同じですが、名前マングリングが異なります ( extern "C"vs extern "C++")
  3. 上記と同じですが、dll エクスポート ( __declspec(dllimport)vs __declspec(dllexport)) が異なります。

解決するには、ファイルの /p を有効にして、ファイルがどのように前処理されているかを確認し (これはファイルごとに行う必要があり、そのファイルの .obj の生成を停止します)、結果を含む .i ファイルを探します。

または、/displayincludes を使用するか、単にコードを検索します。

于 2015-03-17T18:11:35.417 に答える
1

http://tldp.org/HOWTO/C++-dlopen/thesolution.htmlから

C ++には、Cバインディングを持つ関数を宣言するための特別なキーワードextern"C"があります。extern "C"として宣言された関数は、C関数と同様に、関数名をシンボル名として使用します。そのため、extern "C"として宣言できるのは非メンバー関数のみであり、オーバーロードすることはできません。

静的メンバーも可能かもしれextern "C"ないと思いますが、直接やろうとしていることはできません。クラスメンバー関数を呼び出すCのみのラッパーインターフェイスを作成する必要があります。次にextern "C"、ラッパーを作成して、DLLの外部に公開できます。

于 2010-09-09T14:06:50.520 に答える
0

今日、私は同じ問題に直面しました。私にとっては、クラスの前にタイプを含めることができませんでした。つまり、変更する必要がありました:

class Core
{
private:

    py::object cls;
    py::object obj;
    py::object startFunc;
    py::object startFuncAsync;
    py::object stopFunc;
...
public:
...
};

#ifndef CORE_H
#define CORE_H
/* If we are we on Windows, we want a single define for it.*/
#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__))
#define _WIN32
#endif /* _WIN32 */

#if defined(_WIN32) && defined(_CORE_BUILD_DLL)
/* We are building FV as a Win32 DLL */
#define CORE_API __declspec(dllexport)
#elif defined(_WIN32) && defined(CORE_DLL)
/* We are calling FV as a Win32 DLL */
#define CORE_API __declspec(dllimport)
#elif defined(__GNUC__) && defined(_CORE_BUILD_DLL)
/* We are building FV as a shared / dynamic library */
#define CORE_API __attribute__((visibility("default")))
#else
/* We are building or calling CORE as a static library */
#define CORE_API
#endif
class CORE_API Core
{
private:

    py::object cls;
    py::object obj;
    py::object startFunc;
    py::object startFuncAsync;
    py::object stopFunc;
...
public:
...
};

サイドノート:

これにより、プロジェクトを adllまたは aとしてビルドすることができlibます (つまり、それらを含めて使用します)。また、このコードを Linux でコンパイルすることもできるため、ここではプラットフォーム固有のものはありません。

Visual Studio で dll をビルドする場合は、[プロパティ] > [C/C++] > [コマンドライン] に移動して、次のように入力します。

/D_CORE_BUILD_DLL 

CORE自分の指定した名前に置き換えます。

于 2020-04-05T09:59:36.577 に答える
0
//foo.h

#pragma once
#ifdef FOO_EXPORTS
#define FOO_API __declspec(dllexport)
#else
#define FOO_API __declspec(dllimport)
#endif

namespace foo
{
    class Baz
    {
    public:
        FOO_API static auto say_hello() -> void;
    };
}

関数名や末尾の戻り値の型の使用ではなく、重要なことは、型の場合と同じように、エクスポートする関数の前に #defined __declspec の名前を置くことです。

関数定義でも同じことを行います。

//foo.cpp

#include "foo.h"

namespace foo 
{
    FOO_API auto Baz::say_hello() -> void
    {
        do 
        { 
            MessageBox(nullptr, L"Seems to be working okay!", L"OK", MB_OK); 
            exit(1); 
        } 
        while (0);
     }
}

関数の実装は重要ではありません。FOO_API を前に置くだけです。

于 2017-04-14T21:28:46.743 に答える