VS2022 CUDA プロジェクトはダイナミック ライブラリにコンパイルして提供する必要があるため、ダイナミック ライブラリの生成方法を記録します。
1. VS が動的ライブラリを作成する
1. 空のプロジェクトを作成する
VS にはダイナミック リンク ライブラリのテンプレートがありますが、個人的には空のプロジェクトを使用する方が便利だと感じています。
下の図に従って、空のプロジェクトを選択し、次のステップに進みます。
プロジェクト名と場所を指定し、「ソリューションとプロジェクトを同じディレクトリに配置する」にチェックを入れて作成することをお勧めします。
以下に示すように、空のプロジェクト TestMakeLib が正常に作成されました。
2. プロジェクトのプロパティをダイナミック ライブラリとして設定します。
TestMakeLib (上の図の赤いボックス) を選択し、右クリック メニュー -> プロパティ を選択して、プロジェクトのプロパティ ページを開きます。
下図のオプションに従って、構成タイプを「ダイナミック ライブラリ (.dll)」に変更します。
PS: 静的ライブラリをエクスポートする場合は、「静的ライブラリ (.lib)」を選択してください
3. CUDA 構成をプロジェクトに追加します
プロジェクトで CUDA を使用しない場合は、この手順をスキップできます。
TestMakeLib を選択し、右クリック メニュー -> 依存関係の生成 -> カスタマイズの生成を選択します。
CUDA を選択します (環境をインストールするときに、最初に VS2022 をインストールし、次に CUDA をインストールする必要があります。そうしないと、このオプションが表示されない可能性があります)
4. 関連するコード ファイルをプロジェクトに追加します
ダイナミック ライブラリに関連するコードをプロジェクトに追加します。
個人的には、特定のフォルダー構造に従ってコードをプロジェクト ディレクトリにコピーするのが好きです。
次に、プロジェクト内に同じフォルダー構造のフィルターを作成し、
最後に「追加 - 既存の項目」を通じて対応するフィルターにコード ファイルを追加し、プロジェクトによって自動的に生成された他のフィルターを削除します。
最終的な図は次のとおりです。
念のため、接尾辞 .cu が付いた CUDA コードについては、その構成属性が正しいかどうかを確認する必要があります。
.cu ファイルを選択し、右クリック メニュー -> プロパティを選択すると、次のファイルのプロパティ ページが表示されます。
環境設定が正しければ、「全般 -> 項目タイプ」はデフォルトで「CUDA C/C++」になります
。 「CUDA C/C++」に変更できない場合は、3 番目のステップと VS および CUDA 環境が正しくインストールおよび構成されているかどうかを確認する必要があります。
5. ヘッダファイルの関数宣言を変更する
ここでは最も単純なものを取り上げます。
ヘッダーファイルの関数宣言の前に、__declspec (dllexport) を追加するのは、
外部提供関数の前に追加するだけでよく、公開する目的がない場合は追加する必要はありません。
__declspec (dllexport) double cpuSecond();
__declspec (dllexport) void showTimeSpend(double start, const char* flag);
6. コンパイル
コンパイル後、lib ライブラリが正常にコンパイルされたことを示す次のプロンプトが表示されます。
常にデバッグ モードになっているため、生成された lib ファイルと dll ファイルは Debug ディレクトリにあります。
2. VS は動的ライブラリをロードします
次に、新しく生成されたダイナミック ライブラリを他の VS プロジェクトで参照します。
主に次の 2 つの方法があります。
1. プロパティ ページから設定します (通常の VS プロジェクトに適用されます)
①TestUseLib などの VS2022 経由の「コンソール アプリケーション」を作成します。 ②
上記で生成された lib および dll ファイルを新しいプロジェクトにコピーします (ディレクトリ構造: プロジェクトのルート ディレクトリ\Lib)。 ③
使用したヘッダー ファイルを新しいプロジェクトにコピーします。
④ プロジェクト TestUseLib を選択します (右)メニュー -> プロパティ -> VC++ ディレクトリをクリックし、編集します。
PS: インクルード ディレクトリを指定する必要がある場合は、下図の「インクルード ディレクトリ」を編集することで指定できますが、ここでは説明しません。
相対ディレクトリを使用し、Lib ライブラリ ディレクトリ "プロジェクト ルート ディレクトリ\Lib" を追加することをお勧めします。
⑤リンカー -> 入力 -> 追加の依存関係を選択します。ここでは、特定の lib ファイルを指定する必要があります。相対ディレクトリを使用することをお勧めします
。 , dllファイルをプロジェクトにコピーします ホームディレクトリやexeファイルが存在するディレクトリは通常通り使用できます。
2. CMakeLists.txt を介して構成します (VS CMake プロジェクトに適用されます)
その他の詳細についてはこれ以上説明しません。構成された CMakeLists.txt ファイルを貼り付けるだけです。
# 指定cmake最小版本
cmake_minimum_required (VERSION 3.11)
# 声明一个工程Test1,编码语言C++(工程名可以不使用双引号)
project("Test1" LANGUAGES CXX)
# 查找所有的Source文件,记入到自定义ALL_SRC表中
file(GLOB_RECURSE ALL_SRC
#${PROJECT_SOURCE_DIR}/*.cpp
${
PROJECT_SOURCE_DIR}/CMakeProject1.cpp
#${PROJECT_SOURCE_DIR}/Algorithm/*.c
)
# 输出日志,便于查看
MESSAGE("*** add_executable:" ${
ALL_SRC})
MESSAGE("*** PROJECT_NAME:" ${
PROJECT_NAME})
# 添加一个可执行文件,源文件由ALL_SRC中记录的Source文件组成
add_executable(${
PROJECT_NAME} ${
ALL_SRC})
# 查找Lib文件
file(GLOB_RECURSE ALL_LLB
${
PROJECT_SOURCE_DIR}/Lib/*.lib
)
MESSAGE("*** target_link_libraries:" ${
ALL_LLB})
# 将库文件链接到可执行文件
target_link_libraries (${
PROJECT_NAME} ${
ALL_LLB})
3. QT (MinGW でコンパイル) は MSVC ダイナミック ライブラリをロードします
QT は、CMake および qmake を通じてビルドできます。
Cmake でビルドする場合は、CMakeLists.txt 設定を使用します。方法は VS の Cmake と同じです。
ここでは主にqmake Build時に動的ライブラリをロードする方法を記録します。
方法 1. pro ファイルで設定する
#$$PWD表示当前目录,这里就是pro文件所在目录
#注意-L和-l,这里lib文件名称为TestMakeLib.lib
LIBS += -L$$PWD/Lib/ -lTestMakeLib
方法 2. プロジェクトの右クリック メニューの構成
プロジェクトを選択し、右クリック メニュー -> ライブラリの追加... -> 外部ライブラリ -> 次のステップ
プロンプトに従ってライブラリ ファイルを選択し、残りはデフォルトのままにします。
最後に、次のコンテンツが pro ファイルに自動的に追加されます。
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/Lib/ -lTestMakeLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/Lib/ -lTestMakeLibd
else:unix: LIBS += -L$$PWD/Lib/ -lTestMakeLib
INCLUDEPATH += $$PWD/Lib
DEPENDPATH += $$PWD/Lib
参考
共有してくれた次の著者に感謝します。
001 - VS2019 を使用してダイナミック リンク ライブラリ DLL をコンパイルおよび生成する 2 つの方法 002 - ダイナミック ライブラリ
キーワード: __declspec(dllexport) および __declspec(dllimport)
003 - VS2022 MFC プログラムでの CUDA コードの呼び出し
004 - Visual Studio 2022 MinGW を使って C/C++ プログラムをコンパイルおよびデバッグする
005 - CMake で Qt を使う方法を 1 つの記事で理解する
006 - サードパーティ ライブラリのヘッダー ファイルと lib を Qt プロジェクトに追加し、中国語の文字化けを解決する方法
// 更优雅的设计,出自参考002
// 编译动态库时,头文件需要定义OSG_LIBRARY宏
// 编译静态库时,头文件需要定义OSG_LIBRARY_STATIC宏
// 其他程序使用库时,头文件不需要定义任何宏,只在遍历名称前加OSG_EXPORT即可
# if defined( OSG_LIBRARY_STATIC )
# define OSG_EXPORT
# elif defined( OSG_LIBRARY )
# define OSG_EXPORT __declspec(dllexport)
# else
# define OSG_EXPORT __declspec(dllimport)
# endif
最近、C++ クラスのエクスポート ライブラリの問題に遭遇しました。
001-C++ ダイナミック ライブラリのエクスポート クラスのメソッド
002-C++ エクスポート クラスの例
003-C++ DLL エクスポート クラス