C++ ライブラリ ファイルとダイナミック ライブラリ ファイルの特性

C++ライブラリファイル

Windows用静的ライブラリ:.lib

testlib.lib と testlib.h の 2 つのファイルが含まれています。静的ライブラリに含まれる関数を呼び出すプログラムを作成する場合、関数の実装はコンパイル後に生成された exe ファイルに組み込まれるため、その後の exe の操作は実行されません。静的ライブラリに依存する必要がある場合、exe のサイズが大きくなるという代償が伴います。現在、主流のプログラムは一般に静的ライブラリを使用しません。
ここに画像の説明を挿入

Windowsダイナミックライブラリ:.dll

testlib.lib (コンパイル段階で必要) と testlib.dll (呼び出しおよび実行段階で使用) の 2 つのファイルが含まれています。動的ライブラリに含まれる関数を呼び出すプログラムを作成する場合、コンパイル段階では再配置情報のみが設定されます。関数を exe ファイルに書き込むため、その後の exe の操作はダイナミック ライブラリに依存する必要があります。動的ライブラリと静的ライブラリの両方に .lib ファイルがありますが、それらはまったく異なるものであることに注意してください。ダイナミック ライブラリの .lib ファイルは呼び出しのコンパイル フェーズでのみ必要となり、.dll は呼び出しのランタイム フェーズでのみ必要になります。
ここに画像の説明を挿入

Linuxダイナミックライブラリ:libXXX.so

Windowsのダイナミックライブラリと同様に上記のような名前になります。

Linux静的ライブラリ:LibXXX.a

コンパイルライブラリ

Windows静的ライブラリ

§─static_lib.cpp
§─static_lib.h
§─pch.cpp #これら 2 つは vc++ 自体によって生成されたプリコンパイルされたヘッダーです。ここでは └─pch.h には注意を払いません
#これら 2 つは vc++ 自体によって生成されたプリコンパイルされたヘッダーです。 、ここでは注意を払いません

#include "pch.h"
#include "static_lib.h"
int add(int x, int y)
{
    
    
	return x + y;
}

#pragma once
int add(int x, int y);

コンパイルが完了したら、DEBUG フォルダーにある static_lib.lib ファイルを取得し、先ほど使用した static_lib.h を追加して、この 2 つのファイルを使用して add 関数を呼び出すと、呼び出し処理が実行されます。

Windowsダイナミックライブラリ

§─dynamic_lib.cpp
§─dynamic_lib.h
§─pch.cpp #これら 2 つは vc++ 自体によって生成されたプリコンパイルされたヘッダーですが、ここでは注意を払いません └─pch.h
#これら 2 つは vc++ 自体によって生成されたプリコンパイルされたヘッダーです Head,私たちはここでは注意を払いません

#include "pch.h"
#include "dynamic_lib.h"
#define  DLL_API _declspec(dllexport)
DLL_API int add(int a, int b)   //实现两个整数相加
{
    
    
	return a + b;
}

#pragma once
#define  DLL_API _declspec(dllexport)
int add(int x, int y);

コンパイル後、DEBUG で 2 つのファイルdynamic_lib.dllとdynamic_lib.libが生成されます。

Linux静的ライブラリ

§─static_lib.c
└─static_lib.h

#include "static_lib.h"
int add(int a, int b)
{
    
    
	int c;
	c = a + b;
	return c ;
}

#pragma onece
int add(int a, int b);


コンパイル プロセスは 2 つのステップに分かれており、最初に .o ファイルを生成し、次に .o ファイル1、gcc -c static_lib.cに従ってそれらを .a 静的ライブラリ ファイルとしてアーカイブし、次に
それらを静的ライブラリ ファイルとしてアーカイブします。静的ライブラリ libstatic_lib.a
2、ar crv libstatic_lib.a static_lib.o

Linuxダイナミックライブラリ

§─dynamic_lib.c
└─dynamic_lib.h

#include "dynamic_lib.h"
int add(int a, int b)
{
    
    
	int c;
	c = a + b;
	return c ;
}
#pragma onece
int add(int a, int b);

.so ファイルをコンパイルして生成し、コマンド ラインに
~$ gcc Dynamic_lib.c -shared -fPIC -o libdynamic_lib.soと入力します
。一般的に生成される .so ファイルの名前は lib で始まる必要があることに注意してください。

ライブラリを呼び出す

Windows静的ライブラリファイルを呼び出す

§─lib_test.cpp
└─stdafx.h #これは vc++ 自体によって生成されたプリコンパイル済みヘッダーです。ここでは注意を払いません。ここでは
コンパイラーを設定し、静的ライブラリーの名前をコンパイラーに伝え、どのフォルダに入っているか。VS で設定する必要がある場所は、project-properties-VC++ ディレクトリです。パス C:\Users\john\Desktop\static_lib (インクルード ディレクトリに static_lib.h が存在します) を入力し、以前に生成されたパスを入力します。 static_lib.lib は、ライブラリ ディレクトリ内の C:\Users \john\Desktop\static_lib\DEBUG にあります。次に、project-properties-linker-input で、追加の依存関係に static_lib.lib を入力します (このステップは、実際には lib_test.cpp の文 #pragma comment(lib, "static.lib") に相当します。2 つのうちの 1 つを選択できます。 2の)。ようやくコンパイルに成功しました。

Windowsダイナミックライブラリファイルを呼び出す

§─lib_test.cpp
└─stdafx.h #これは vc++ 自体によって生成されたプリコンパイル済みヘッダーです。ここでは注意を払いません

#include "stdafx.h"
#pragma comment(lib, "dynamic_lib.lib")
extern int add(int a, int b);
int _tmain(int argc, _TCHAR* argv[])
{
    
    
	int a = 0, b = 2, c;
	c = add(a, b);
	return 0;
}

ここでは、コード内の include が 1 つ減り、extern が 1 つ増えていることに注意してください。VS で設定する必要がある場所は、project-properties-VC++ ディレクトリであり、ライブラリ ディレクトリに、以前に生成した Dynamic_lib.lib パス C:\Users\john\Desktop\dynamic_lib\DEBUG を記入します。次に、project-properties-linker-input で、追加の依存関係にdynamic_lib.lib を入力します (このステップは、実際には、lib_test.cpp の文 #pragma comment(lib, "static.lib") に相当します。2 つのうちの 1 つを選択できます。 2の)。ようやくコンパイルに成功しました。実行するときは、exe が生成されるフォルダーに .dll ファイルを置く必要があります。そうしないと、コンパイルが成功したときにエラーが発生します。

ダイナミックライブラリの機能:

Ꝏ动态库把对一些库函数的链接载入推迟到程序运行的时期。
Ꝏ可以实现进程之间的资源共享。(因此动态库也称为共享库)
Ꝏ将一些程序升级变得简单。
Ꝏ甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

Window 与 Linux 执行文件格式不同,在创建动态库的时候有一些差异。
Ꝏ在 Windows 系统下的执行文件格式是 PE 格式,动态库需要一个 DllMain 函数做出初始化的入口,通常在导出函数的声明时需要有 _declspec(dllexport)关 键字。
ꝎLinux 下 gcc 编译的执行文件默认是 ELF 格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

おすすめ

転載: blog.csdn.net/weixin_43925768/article/details/128114611