1. ダイナミックライブラリとスタティックライブラリを理解する
静的、動的とはリンクを指します
いわゆる静的および動的とはリンクを指します。プログラムを実行可能プログラムにコンパイルする手順を確認します。
リンク: 外部関数のコード (通常は拡張子 .lib および .a が付いたファイル) を実行可能ファイルに追加します。これをリンクと呼びます。このように、外部関数ライブラリを実行ファイルにコピーして追加する方法を静的リンク(静的リンク)、動的リンク(ダイナミックリンク)といいます。
命名方法
Linux の場合:
静的ライブラリ: lib ライブラリ名.a
動的ライブラリ: lib ライブラリ名.so(共有オブジェクト)
ウィンドウ:次へ
スタティックライブラリ:libライブラリ名.lib
ダイナミックライブラリ:libライブラリ名.dll(ダイナミックリンクライブラリ)
概念を区別します。ライブラリとは、接頭辞 lib と接尾辞 .a または .so を含む全体です。
ライブラリ名はプレフィックスとサフィックスを削除した残りの部分です
ダイナミックライブラリとスタティックライブラリの特徴
静的ライブラリの特徴:
1. 静的ライブラリを使用すると、静的ライブラリの情報が直接実行可能ファイルにコンパイルされます
2. 利点: 静的ライブラリを削除しても、実行可能ファイルには影響がありません。
3. 欠点: メモリ領域の無駄。静的ライブラリが変更された場合は、実行可能プログラムを再コンパイルする必要があります
ダイナミック ライブラリの特性:
ローダーがダイナミック ライブラリをロードするとき、オペレーティング システムはまずダイナミック ライブラリが他のプログラムによってメモリにロードされているかどうかを確認します。メモリにロードされていない場合、オペレーティング システムはダイナミック ライブラリをメモリにロードし、その参照カウントを 1 に設定します。メモリにロードされている場合は、ダイナミック ライブラリの参照カウントに 1 を追加するだけです。
2. 動的ライブラリと静的ライブラリを構築する
プロジェクトディレクトリ
Haha.cpp は、関数に名前を付けるなど、何かを書くだけで、「haha」を出力します。
CMakeList.txt
aux_source_directory(./ SOURCES)
add_executable(example ${SOURCES})
# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2 同时得到两个软链接 具体看结果说明
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)
# 添加静态库 得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")
# 设置可执行文件的输出路径 这是是工程目录下的lib目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 设置库文件的输出路径 这是是工程目录下的lib目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
結果の説明
実行すると、lib ディレクトリが作成されます。このディレクトリには、実行可能ファイルと、構築したダイナミック ライブラリ ファイルおよび静的ライブラリ ファイルが含まれています。
lib ディレクトリを開きます。
libhello.a ファイルは静的ライブラリ ファイルであり、次のコマンドで取得できます。
# 添加静态库 得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")
libhaha.so.1.2 ファイルは静的ライブラリ ファイルであり、libhaha.so.1 ソフト リンク libhaha.so ソフト リンクは次のコマンドで取得されます。
# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2 同时有两个链接
# VERSION指代动态库版本, SOVERSION 指代API版本
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)
3. 動的ライブラリを使用する
動的ライブラリの使用条件
ダイナミック ライブラリのヘッダー ファイルが必要です。ここに haha.h ヘッダー ファイルがあります。
動的ライブラリが配置されているパスを知っている必要があります。
CMakeLists.txt
# 动态库所在目录
set(lib_dir "/home/jason/work/my-deploy/example/lib")
# 添加 动态库头文件 搜索路径
include_directories(./)
# 生成可执行文件
add_executable(example main.cpp)
# 链接库文件到可执行文件 库文件名称要写全
target_link_libraries(example ${lib_dir}/libhaha.so)
mai.cpp では、ダイナミック ライブラリの関数を使用する前に、ダイナミック ライブラリのヘッダー ファイルを適用する必要があります。
ここで、ヘッダー ファイルは haha.h で、ダイナミック ライブラリ関数は haha() で、haha! を出力します。
#include <iostream>
#include "haha.h"
using namespace std;
int main()
{
cout << "Hello World!" << endl;
haha();
return 0;
}
4. 静的ライブラリを使用する
スタティック ライブラリの使用方法は基本的にダイナミック ライブラリの使用方法と同じですが、スタティック ライブラリが配置されているパスとスタティック ライブラリのヘッダー ファイルも準備する必要があります。
CMakeLists.txt
ライブラリファイルをリンクするときは、静的ライブラリ名に変更するだけです
# 静态库所在目录
set(lib_dir "/home/jason/work/my-deploy/example/lib")
# 添加 静态库头文件 搜索路径
include_directories(./)
# 生成可执行文件
add_executable(example main.cpp)
# 链接库文件到可执行文件 库文件名称要写全
target_link_libraries(example ${lib_dir}/libhello.a)
参考:
[cmake Combat 6] コンパイル済みライブラリ (ダイナミック ライブラリ DLL) の使用方法 —— windows system_cmake COMPILE ダイナミック ライブラリ_ Zheng's Notes Blog-CSDN Blog [cmake Combat 5] コンパイル済みライブラリ (
静的ライブラリ) の使用方法 —— Windows system_windows COMPILE static library_Zheng クラスメートのメモ ブログ - CSDN ブログ
静的ライブラリ/動的ライブラリを作成するにはヘッダー ファイルが必要ですか? なぜ?_静的ライブラリを使用するにはヘッダー ファイルが必要ですか?_ホットソースに浸したスイカを食べるブログ - CSDN ブログ
静的ライブラリを使用することと、C++ でソース コードを直接使用することの違いは何ですか? _静的ライブラリ リンクの生成と直接コンパイルの違い_Qianmo Yangyang のブログ-CSDN ブログ
C++ コンパイル (3)-camke/CMakeLists.txt コンパイルと使用チュートリアル - プログラマーが求めた