@tkymt (拓 山本)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

wWinMainを静的ライブラリに含めたい

ゲームエンジンなどのフレームワークは、どういうわけか、main関数を書かない。
dxlibなどのライブラリは、main関数を書く。
ようするに、ボイラーテンプレートと呼ばれるコードを書く。

それなら、どうやっているのか確かめてみました。
以下は、main関数を静的ライブラリに含める試みです。

CMakeLists.txt
  add_library(${PROJECT_NAME} STATIC)
  target_sources(${PROJECT_NAME} PRIVATE main.cpp )
  target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE UNICODE)
framework_main.cpp
#include <Windows.h>
#include <tchar.h>

_Use_decl_annotations_
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
{
    return 0;
}
CMakeLists.txt
add_executable(${PROJECT_NAME} WIN32)
target_sources(${PROJECT_NAME} PRIVATE main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE luna)
target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE UNICODE)
0 likes

1Answer

これは、質問ですか?
何か実践して自己解決しているようですし、記事を間違えて質問として投稿しているようにも見れます。
質問であれば、主題である「聞きたいこと」をもっと明確にしていただきたい。


質問であれば、「一部のフレームワークにはmain関数を書かなくてもいいものが存在するが、それはどのような仕組みなのか。静的ライブラリではどのように実現しているのか」ということでいいんでしょうか。

もしかすると、静的ライブラリという得体の知れないものを大げさに考えているのかも知れませんが、実は大した話ではありません。
静的ライブラリというのは、単純にコンパイルされたプログラムコードが一つにまとめられただけのものです。

静的ライブラリを使用しない場合、実行ファイルを作るには、

  1. 自分でコードを書く。
  2. コンパイルして、個々のソースコードのオブジェクトファイルを作成する。
  3. オブジェクトファイルをまとめてリンクし、一つの実行ファイルにする。

という手順を踏みます。(最近は2,3は「ビルド」という手順でまとめてやってしまうので、気づかないかも知れませんが。)

これが、静的ライブラリを使用した場合、

  1. 誰かが静的ライブラリの部分のコードを書く。
  2. 1のコードをコンパイルして、個々のソースコードのオブジェクトファイルを作成する。
  3. 2のオブジェクトファイルを一つにまとめて、静的ライブラリファイルを作る。
  4. 自分でライブラリ以外の部分のコードを書く。
  5. 4のコードをコンパイルして、個々のソースオードのオブジェクトファイルを作成する。
  6. 5のオブジェクトファイルと、3の静的ライブラリファイル(の中にまとめられたオブジェクトファイル)をまとめてリンクし、一つの実行ファイルにする。

という手順に変わるだけです。
リンクの際に、最初に起動するためにmain関数を探す際には、数あるオブジェクトファイルからmainという関数を探すだけであり、それが個々のオブジェクトファイルか、静的ライブラリ内にあるオブジェクトファイルかは、意識しないし意識する必要もない、ということです。

一点だけ補足しておくと、一般的に同じ名前の関数があるとエラーになりますが、ライブラリの中と外で同じ名前のものがあった場合はエラーにならず、ライブラリの中のものは無視されます。(実際はコンパイラによると思いますが、大抵そうです)
試されたビルドで同じ内容のコードがライブラリの中と外で存在することになりますが、エラーにならない(と書かれていませんが、多分)のは、そのような理由です。

0Like

Your answer might help someone💌