8

タイトル通り、Cを使用してDLLを構築し、C++プロジェクトからリンクしようとしています。私はインターネットでさまざまなチュートリアルを読んでそれに従いましたが、何かが足りないときはいつでも、何がわからないのです。

これが私がしたことです、ステップバイステップ:

名前の付いた新しいWin32プロジェクトを作成testlibし、ウィザードから「DLL」と「空のプロジェクト」を選択しました。

ヘッダーを追加しました:

//testlib.h

#include <stdio.h>

__declspec(dllexport) void hello();

ソースを追加しました。私が読んだCソースにしたいので、.cの.cppファイルの名前を簡単に変更する必要があります。

//testlib.c

#include "testlib.h"

void hello() {
    printf("DLL hello() called\n");
}

ビルドは成功しました。

次に、別のプロジェクトで便利なdllを使用したいと思います。

次に:新しいプロジェクト(testlibUse)。今回は「空のプロジェクト」を選びました。
ヘッダーを追加する必要はありません。cppソースを作成するだけです。

//main.cpp
#include <testlib.h>

int main() {
    hello();
}

それで:

  • testlib.dll[プロパティ]->[VC++ディレクトリ]->[実行可能ディレクトリ]にあるフォルダへのパスを追加しました

  • testlib.h[プロパティ]->[VC++ディレクトリ]->[ディレクトリを含める]にあるフォルダへのパスを追加しました

  • testlib.lib[プロパティ]->[リンカー]->[入力]->[追加の依存関係]に(拡張機能を含む)へのパスを追加しました

ビルドしようとしましたが、リンカーエラーが発生しました:

リンク:C:\ path \ testlibUse \ Debug \ testlibUse.exeが見つからないか、最後の増分リンクによってビルドされていません。フルリンクの実行
main.obj:エラーLNK2019:関数_mainで参照される未解決の外部シンボル "void __cdecl hello(void)"(?hello @@ YAXXZ)
C:\ path \ testlibUse \ Debug \ testlibUse.exe:致命的なエラーLNK1120:1未解決の外観

に戻ってtestlib名前を変更testlib.ctestlib.cpp、dllを再構築すると、ビルドはできtestlibUseますが、実行時に「dllが見つかりません」というエラーが発生します。

「リリース」で両方のプロジェクトの構成を変更(必要に応じてパスを変更)しようとしましたが、何も変更されませんでした。

長い投稿で申し訳ありませんが、私がしたことを正確に書き留める必要があったと思います。

助言がありますか?

さらに、Qtプロジェクトでdllを使用する場合に変更する必要のある構成パラメーターはありますか?

4

4 に答える 4

11

あなたにはいくつかの問題があります:

  1. ヘッダーファイルは、DLLでコンパイルされる場合はエクスポートされたものとして、ライブラリユーザーによってコンパイルされる場合はインポートされるものとして関数をマークする必要があります。
  2. ヘッダーファイルはextern "C"、C ++としてコンパイルするときに関数宣言をブロックでラップして、名前が壊れないようにする必要があります
  3. DLLは実行可能ファイルのライブラリ検索パス上にないため、実行時に見つかりません。

(1)と(2)を修正するには、ヘッダーを次のように書き直します。

#ifdef __cplusplus
extern "C" {
#endif

// Assume this symbol is only defined by your DLL project, so we can either
// export or import the symbols as appropriate
#if COMPILING_MY_TEST_DLL
#define TESTLIB_EXPORT __declspec(dllexport)
#else
#define TESTLIB_EXPORT __declspec(dllimport)
#endif

TESTLIB_EXPORT void hello();
// ... more function declarations, marked with TESTLIB_EXPORT

#ifdef __cplusplus
}
#endif

(3)を修正するには、DLLを実行可能ファイルと同じフォルダーにコピーします。設定している「実行可能ディレクトリ」設定は、DLL検索には影響しません。DLLの検索方法の詳細については、MSDNを参照してください。最善の解決策は、実行可能ファイルが存在するディレクトリにDLLをコピーすることです。これは手動で行うか、これを行うプロジェクトにビルド後の手順を追加することができます。

于 2012-05-02T17:26:27.203 に答える
3

以下を含める必要extern "C"があります。

extern "C" {
    #include <testlib.h>
}
于 2012-05-02T17:09:53.940 に答える
1

コンパイラがcppビルドでシンボル名を壊さないようにする必要があるように見えます。extern "C"testlib.hの定義にを追加できるはずです。

#ifdef __cplusplus
extern "C"
#endif
__declspec(dllexport) void hello();
于 2012-05-02T17:09:33.170 に答える
1

C++にインクルードできるCヘッダーファイルのメソッドは次のとおりです。DLLプリプロセッサ設定TESTLIB_EXPORTSでのみ設定してください。DLLを使用するためにこのヘッダーを含むプロジェクトでは、ヘッダーは関数をエクスポートではなくインポートとして宣言します。

ガードは、__cplusplusC++の名前装飾の代わりにCの名前装飾を使用して関数をインポートするようにコンパイラーに指示します。

#include <stdio.h>

#ifdef TESTLIB_EXPORTS
#define TESTLIB_API __declspec(dllexport)
#else
#define TESTLIB_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

TESTLIB_API void hello();
/* other prototypes here */

#ifdef __cplusplus
}
#endif
于 2012-05-02T17:26:46.097 に答える