📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の2版が非表示) | |||
| 34行目: | 34行目: | ||
== 静的ライブラリ == | == 静的ライブラリ == | ||
==== 静的ライブラリの作成 ==== | ==== 静的ライブラリの作成 ==== | ||
# QT Creatorのメイン画面から、[ファイル]メニューバー - [ファイル / プロジェクトの新規作成]を選択する。 | # QT Creatorのメイン画面から、[ファイル]メニューバー - [ファイル / プロジェクトの新規作成]を選択する。 | ||
| 55行目: | 48行目: | ||
プロジェクトをビルドして、静的ライブラリを生成する。<br> | プロジェクトをビルドして、静的ライブラリを生成する。<br> | ||
生成されたライブラリは、Windowsの場合は<code>.lib</code>拡張子、Linuxの場合は<code>.a</code>拡張子である。<br> | 生成されたライブラリは、Windowsの場合は<code>.lib</code>拡張子、Linuxの場合は<code>.a</code>拡張子である。<br> | ||
<br> | |||
==== プロジェクト構造 ==== | |||
# プロジェクト構造の例 | |||
mylib/ | |||
├── mylib.pro # Qtプロジェクトファイル | |||
├── CMakeLists.txt # CMakeプロジェクトファイル (CMakeを使用する場合) | |||
├── mylib.h # ヘッダファイル | |||
├── mylib.cpp # 実装ファイル | |||
└── mylib_global.h # エクスポートマクロ (オプション) | |||
<br> | |||
==== QMakeを使用する場合 ==== | |||
変数 <code>TEMPLATE</code> に <code>lib</code>、変数 <code>CONFIG</code> に <code>lib</code> または <code>staticlib</code> を指定する必要がある。<br> | |||
<syntaxhighlight lang="make"> | |||
QT -= gui # GUIが不要な場合 | |||
QT += core # 最低限必要なQtモジュール | |||
TARGET = mylib | |||
TEMPLATE = lib | |||
CONFIG += staticlib # スタティックライブラリとして設定 | |||
# C++標準の指定 | |||
CONFIG += c++17 | |||
# 出力ディレクトリ | |||
DESTDIR = $$PWD/lib | |||
# ソースファイル | |||
SOURCES += \ | |||
mylib.cpp | |||
# ヘッダファイル | |||
HEADERS += \ | |||
mylib.h \ | |||
mylib_global.h | |||
# インストール設定 (オプション) | |||
unix { | |||
target.path = /usr/lib | |||
INSTALLS += target | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== CMakeを使用する場合 ==== | |||
<syntaxhighlight lang="cmake"> | |||
# CMakeLists.txtファイル | |||
cmake_minimum_required(VERSION 3.21) | |||
project(mylib VERSION 1.0.0 LANGUAGES CXX) | |||
# C++標準の設定 | |||
set(CMAKE_CXX_STANDARD 17) | |||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | |||
# Qtパッケージの検索 | |||
# Qt 5の場合 | |||
# find_package(Qt5 REQUIRED COMPONENTS Core) | |||
# Qt 6の場合 | |||
find_package(Qt6 REQUIRED COMPONENTS Core) | |||
# ソースファイルとヘッダーファイル | |||
set(SOURCES | |||
mylib.cpp | |||
) | |||
set(HEADERS | |||
mylib.h | |||
mylib_global.h | |||
) | |||
# スタティックライブラリの作成 | |||
add_library(mylib STATIC ${SOURCES} ${HEADERS}) | |||
# Qtモジュールとリンク | |||
# Qt 5の場合 | |||
# target_link_libraries(mylib PUBLIC Qt5::Core) | |||
# Qt6の場合 | |||
target_link_libraries(mylib PUBLIC Qt6::Core) | |||
# インクルードディレクトリの公開 | |||
target_include_directories(mylib PUBLIC | |||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> | |||
$<INSTALL_INTERFACE:include> | |||
) | |||
# 出力ディレクトリの設定 | |||
set_target_properties(mylib PROPERTIES | |||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib" | |||
) | |||
# インストール設定 (オプション) | |||
install(TARGETS mylib | |||
ARCHIVE DESTINATION lib | |||
) | |||
install(FILES ${HEADERS} | |||
DESTINATION include/mylib | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
==== ソースファイルの例 ==== | |||
<syntaxhighlight lang="c++"> | |||
// mylib.cppファイル | |||
#include "mylib.h" | |||
MyLib::MyLib() : m_internalValue(0) | |||
{ | |||
} | |||
QString MyLib::getVersion() | |||
{ | |||
return "1.0.0"; | |||
} | |||
int MyLib::add(int a, int b) | |||
{ | |||
return a + b; | |||
} | |||
QString MyLib::processText(const QString &input) | |||
{ | |||
return input.toUpper(); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// mylib.hファイル | |||
#ifndef MYLIB_H | |||
#define MYLIB_H | |||
#include <QString> | |||
class MyLib | |||
{ | |||
private: | |||
int m_internalValue; | |||
public: | |||
MyLib(); | |||
// ライブラリの機能 | |||
static QString getVersion(); | |||
int add(int a, int b); | |||
QString processText(const QString &input); | |||
}; | |||
#endif // MYLIB_H | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// mylib_global.hファイル | |||
#ifndef MYLIB_GLOBAL_H | |||
#define MYLIB_GLOBAL_H | |||
// スタティックライブラリの場合は空でOK | |||
// 将来的にダイナミックライブラリに変更する場合に備える | |||
#endif // MYLIB_GLOBAL_H | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== 静的ライブラリのリンク ==== | ==== 静的ライブラリのリンク ==== | ||
| 583行目: | 740行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== 関数名の確認 == | |||
soファイル (共有ライブラリファイル) に公開されている関数名を確認する場合、stringsコマンドでは不十分である。<br> | |||
stringsコマンドは、バイナリファイルから単純に文字列を抽出するため、関数名だけでなく他の多くの不要な文字列も含まれる。<br> | |||
<br> | |||
公開されている関数名やシンボルを確認する場合、以下に示すコマンドを使用する。<br> | |||
<br> | |||
これは、ライブラリの動的シンボルテーブルが表示されて、公開されている関数を確認することができる。<br> | |||
共有ライブラリの公開されている関数名を簡単に確認することができる。<br> | |||
<br> | |||
* <code>nm -D <ライブラリファイル></code>コマンド | |||
*: バイナリファイルからシンボル情報を表示する。 | |||
*: 関数名やシンボルが確認できる。 | |||
*: <br> | |||
*: また、<code>-D</code>オプションを付加すると、共有ライブラリの動的シンボルのみが表示できる。 | |||
*: <br> | |||
* <code>readelf -Ws <ライブラリファイル></code>コマンド | |||
*: シンボルテーブルを表示する。 | |||
*: <br> | |||
*: これにより、関数や変数の情報を含むシンボルテーブルが表示される。 | |||
*: 出力のType列でFUNCと表示されているものが関数である。 | |||
*: <br> | |||
* <code>objdump -T <ライブラリファイル></code> | |||
*: 詳細な情報を出力する。 | |||
<br><br> | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||