2016-03-29 11 views
1

SDLには、そのインメントメントにWinMainがあり、SDL_main関数が宣言されています。 ユーザーは、その関数の本体とその機能を持つSDLライブラリ呼び出しのエントリポイントを定義できます。SDLのようなメインエントリポイントを含むライブラリをC++でビルドする方法

同じ実装でライブラリを実装したいと思います。 どのようにして、エントリポイントを含むライブラリをC++でビルドし、SDLのように定義されて呼び出される関数のプロトタイプをユーザに与えるのですか?

可能な実装は次のようになります。

Lib.hpp:

#define Main lib_main 
extern int lib_main(); 

Lib.cpp:

#include "lib.hpp" 

int main(){ 
    // the lib code runs here 
    lib_main(); 
} 

は後に、私はそうのように使用することができ、このライブラリを構築:

main.cpp

#include "lib.hpp" 
int Main(){ 
    // The user code 
} 

私はそのコマンドでLib.cppをコンパイルすることはできません。

グラム++ -shared -o lib.cpp Lib.dll -Wl、 - アウトIMPLIB、libLib.a

それが取得lib_main()の定義されていない参照。

私は窓を使用しています。

+0

'int main(){...}'は 'int lib_main();(){...}'として展開されます.Lib.hppの '#define'を更新したいかもしれません。 – AJNeufeld

+0

更新。ありがとう –

+0

ビルドフラグで[プログラムのエントリポイントを変更する](http:// stackoverflow。com/questions/7494244/how-to-change-entry-of-c-program-with-gcc)を参照してください。 – Matt

答えて

3

プラットフォームを指定していませんが、GCCを使用している場合はコードが機能します。

そうのような静的ライブラリのコンパイル:

g++ -L. -lLib -o main main.cpp 

OR

そうのような* nixのための共有ライブラリをコンパイルします:

g++ -c -o Lib.o Lib.cpp 
ar rcs libLib.a Lib.o 

はそうのようなメインプログラムがコンパイル

g++ -shared -o libLib.so Lib.cpp 

そのようなメインプログラムのコンパイル:そうのような共有ライブラリとWindows用のインポートライブラリをコンパイルし

g++ -L. -lLib -o main main.cpp 

OR

を:

g++ -shared -o libLib.dll --Wl,--out-implib,libLib_dll.a Lib.cpp 

はそうのようなメインプログラムをコンパイルし、インポートライブラリとリンクし、現在のディレクトリをランタイム検索パスに追加します。

g++ -L. -lLib_dll -Wl,-rpath,. -o main main.cpp 
+0

お返事ありがとうございます。私は試して、それは動作します。しかしここに事がある。 これらのコマンドを実行して共有ライブラリと静的ライブラリを作成すると、 g ++ -c Lib.cpp g ++ -shared -o Lib.dll Lib.o -Wl、-out-implib、libLib.a g ++ main.cpp -o main -L。 -lLib .aと実際のメインプログラムをコンパイルするだけですが、.dllはコンパイルしません。 dllファイルがないため、プログラムを実行できません。 違いをご存知ですか? –

+0

静的ライブラリと共有ライブラリの両方を構築しようとしているようです。静的ライブラリと共有ライブラリのインポートライブラリを混同しないように注意してください。更新された回答を確認してください。 – Chaos

関連する問題