C++のdllの作り方を教えてください

このQ&Aのポイント
  • C++で共通クラスを作成しDLL化する方法について教えてください。
  • コンパイルする際のアーカイブ作成とDLL作成の違いについて教えてください。
  • DLLを使用する際のヘッダーファイルの記述方法と使用方法について教えてください。
回答を見る
  • ベストアンサー

C++のdllの作り方を教えてください。

こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? これは、Windows で DLL を作成するときの __declspec(dllimport) なんかを 想定した質問でしょうか? 一般的な unix 系では、特に必要ありません(「私が見たことが無い」という 方が正確な表現ですが)。 DLL に入れておきたいオブジェクトファイルを用意しておいて、 % gcc -G -o aaa.so aaa.o という感じです。 ar コマンドで作成されるアーカイブとは違って、DLL は「リンクされたもの」 ですから、必要なオブジェクトファイルが増減したときには、追加・削除では なく、常に再リンクをすることに注意してください。 > また、できあがったdllを使う側では、ヘッダーファイルをインクルードして > LIBパスの通ったところにdllを入れておけば良いのでしょうか? DLL を探すのは、LD_LIBRARY_PATH という環境変数を使います。DLL の置き場所 をそれに追加しておく感じになります。   ※ でも、本当はいろいろと細かいことがあります。とりあえず ld の man が参考になると思います。

orange_pie
質問者

お礼

くまさん、またまたありがとうございます。 知りたかったのは、 >DLL に入れておきたいオブジェクトファイルを用意しておいて、 >% gcc -G -o aaa.so aaa.o という部分です。 早速やってみます。 ところで、この出来上がったDLLはJAVAアプリからも使用できますよね? それって。。。。 また勉強しまーす!!ありがとうございました(*^_^*)

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> >% gcc -G -o aaa.so aaa.o 静的なアーカイブと同様に、libなんとか.so という名前にしておくと、 その DLL を使う方のプログラムのリンク時に -l オプションが使えます。 % gcc -G -o libaaa.so aaa.o リンクする方では、 % gcc -o testX testX.cpp -laaa > ところで、この出来上がったDLLはJAVAアプリからも使用できますよね? またまた、蛇足をば。 (詳しくは知らないんですが)C++ で作ったクラスを、そのまま Java で 使えるんだ、という意味であれば *使用できません* 。 Native Interface というのを通して、Java 以外の言語で構築されたコードを Java から、呼び出すことができます。 もし、情報の受け渡しが必要であれば、呼び出される Java 以外の言語で構築 されたコードの方で Java の型を意識したプログラムを書かないといけないです。

関連するQ&A

  • UNIXのC++で共通クラスを作ってみんなで使いたい。

    Linux上で稼動するあるC++のプログラムを作るのに、 みんなで使えるような、共通クラスを作りたいと思っています。 クラス自体の作り方(プログラムコード)はだいたい分かるのですが、 それをどのような形(lib?またはアーカイブ?またはdll?)で 配布すると、みんなが使いやすいものになるのかが分かりません。 手順など、どなたか教えてください。 私が何とか予想できる手順を以下に書きます。 (1)普通にクラスを作成する。(例えばaaa.cppと言う名前のファイルに)   public class AAA{ public: void init(); void clean(); private: int elems; } void AAA::init(){ elems = 0; } void AAA::clean(){ elems = 0; } ※この時点でクラスの定義部分だけをヘッダーファイルとして   別ファイルにしておいた方が良いのでしょうか? (2)このクラスをコンパイルして、みんなに提供できる何らかの形にする。  ※ここがよく分かりません!!  ※”.a”というアーカイブを作成する方法は知っています。   これを作れば良いのでしょうか? (3)出来上がった共通クラスをどうにかして、他の人のプログラムで使えるようにする。  ※予想としては、(1)で作ったクラス定義のヘッダーファイルを   includeする(のかな?)   それから、コンパイルする時にmakefileの中で(2)で作った   ライブラリ(?)を一緒にリンクする(のかな?)  ※プログラム中では、いきなり    AAA testBuf = new AAA(); testBuf.init(); などと使えるのでしょうか?

  • 【C++】DLLの中身

    親クラス:ParentClassが、 メンバ m_a メソッド GetA SetA それを継承した子クラス:ChildClass が、 メンバ m_a ←オーバーライド m_b ←子クラスで追加 メソッド GetA ←オーバーライド SetA ←オーバーライド GetB ←子クラスで追加 SetB ←子クラスで追加 という構成で、それぞれ別のDLLを作成したとき、 以下のどちらになるでしょうか? 「(1)」の認識であり、必ず、子クラスは、親クラスのファイルサイズよりも大きくなるという認識です。 (1)「ChildClass.DLL」では、 コンパイル時の「ParentClass」の処理内容を内包している。 (※ChildClass.DLLのコンパイル時に、親クラスの処理も、記載されたような状態でDLLが作成される) (2) 「ChildClass.DLL」では、 コンパイル時の「ParentClass」の処理内容を内包せず、 実行時に、親クラスのDLLに委譲している。 また、「(1)」であるならば、 親クラスにバグがあって修正した場合、 必ず子クラスも再コンパイルしなければならない認識ですが合っていますでしょうか? /**************************************/ また、DLLがクラスX、クラスYで構成されているとき、 クラスXのobj と、 クラスYのobj と、 クラスXのlib (クラスYから、クラスXの処理を呼び出せるようにするために、クラスX側からpublic で実行できる関数のIN・OUTの仕様が記載されている) クラスYのlib が、含まれているという認識で良いのでしょうか? .   コンパイル時、libや、objができますが、これらはDLLに内包される

  • CygwinからVisual C++へ

    Cygwinでコンパイルしていたプログラムを、 Visual C++の cl コマンドでコンパイルしたいです。 あるプログラムを書きまして、Cygwinをインストールし、 [block.rc] BLOCKS BITMAP "block.bmp" という内容のリソースファイルを作成して、 windres block.rc -o block.o gcc -mwindows aaa.cpp block.o でちゃんとコンパイルできていました。 上記のように Visual Studio 2010 のVisual C++でコンパイルするにはどうしたらいいのかわかりません。 cl aaa.cpp block.o とやっても cl -mwindows aaa.cpp block.o とやっても、コンパイルできませんでした。 -mwindowsに代わるclコマンドのオプションを探してはみてみたものの、 -GA windowsアプリケーション用の最適化を行う というものを見つけたのでやってみましたがだめでした。 どなたか、コンパイルのアドバイスを下さい。

  • Unix上C++でのdllとインポートライブラリの関係

    こんにちわ。 いつも教えてgooにお世話になっているorange_pieです。 UNIX上のC++で作成した自作ライブラリをdllにして配布したいのですが、 Unixでの基本的な考え方を教えてください。 (1)Unix上ではDLLの標準的な名称は”libxxxx.so”とするのが普通ですか?  ※この形式ならLD_LIBRARY_PATH環境変数が検索してくれる。。。 (2)通常、DLLにする場合、インポートライブラリ(.lib)と実際のライブラリ(.so)を作成して、使用する側はインポートライブラリのみをリンクするのでしょうか? (3)配布されたdllを使う側では、Link時にインポートライブラリをリンクして、関連インクルードファイルをインクルードするだけで使えるのでしょうか? (4)上記の(2)のように、インポートライブラリとライブラリの実態を作成する為のコンパイルオプションが見つかりません。(ldのmanを見たのですが、意味がわからないと言うか。。。。。) この質問は、自作ライブラリからlibxxx.soという形のオブジェクトファイルを作り、別プログラムからこのlibxxxをコンパイルオプション(-l)でリンクしてみたら正しく動作したのですが、これでは結局ライブラリの本体が一緒にリンクされている様子で、出来上がった実行形式のファイルサイズが静的ライブラリとしてリンクした時と同じ大きさになっていることに疑問を抱いてしまったものです。  この状態でも、ライブラリの方だけコンパイルしなおして実行すると ちゃんとライブラリの変更点は反映されるので問題は無いのですが、 これでもダイナミックリンク・ライブラリと呼べるのでしょうか?

  • C++言語でのライブラリファイルの作成と使用法

    よろしくお願いします。 C言語において、例えばMinGWのCコンパイラのLibディレクトリには、拡張子が「.a」のライブラリファイルがたくさん存在しています。これらは、arコマンドで ar crv libMine.a 1.o 2.o のように作成されるものだと認識しています。 一方、C++言語において、例えばBorlandのC++コンパイラのLibディレクトリには、拡張子が「.lib」というライブラリファイルがたくさん存在します。 これらのファイブラリファイルは、C言語のaファイルと同じ役割をする考えてよいのでしょうか? また、C++において自作のライブラリファイル(libファイル)を作成するにはどうすればよいのでしょうか? 次に、C++における自作ライブラリの使用法についてですが、Cではコンパイル時に gcc -o 1.exe 1.c libMine.a のようにして、自作のライブラリファイルを使うことができますが C++のコンパイルコマンド、例えばbcc32コマンドを使ってコンパイルする時に、 自分が作成したlibファイルを使うにはどのようにすればよいのでしょうか? 最後に、Borland C++コンパイラをインストールするときに、Binディレクトリにあるbcc.cfgファイルに -L"c:\Borland\Bcc55\lib" と記述したのですが、これは、 c:\Borland\Bcc55\libにあるlibファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • Visual studio c++ dll作成時のエラー

    c初心者です。 ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。

  • ボーランドC++でのDLL作成トラブル

    いつものように、ボーランド社のコンパイラでdllを作成しましたが、以下のエラーが出ます。 C:\implib a.dll a.lib Borland Implib Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation Error a.lib: unknown file type コンパイル直後には、容量が10k以上のファイルになっているのですが、暫くすると、1kになっています。コンパイラが不調なのですが、原因は何でしょう?

  • C++/CLIで、アンマネージC++のDLLを使用する方法

    こんにちは。 C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。 ネット上をいろいろ調べたのですが、具体的な手段がわかりません。 見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。 かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。 また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。 ■アンマネージC++のDLL VC++6.0で、以下のように、単にデバッグ文字列を書き出すだけのDLL関数を作成しました。 (このDLLが使用できることは他のVC++6.0プロジェクトで確認済みです) /*-----Func.h-----*/ #ifndef __FUNC_H__ #define __FUNC_H__ AFX_EXT_CLASS void WINAPI ShowMessage(); #endif //__FUNC_H__ /*-----Func.cpp-----*/ #include "StdAfx.h" #include "Func.h" #include <stdio.h> void WINAPI ShowMessage() { CString str = "This is The Message from DLL Func!\n"; OutputDebugString(str); } ■C++/CLI でのDLL使用 Visual Studio2008にて、C++のCLRプロジェクトを作成して、以下のようにDLLを使用する準備を行いました。 1.ソリューションエクスプローラのヘッダフォルダに、Func.hを追加 2.プロジェクトのフォルダに、上記で作成したFuncのDLLとLIBファイルを置く。 3.プロジェクトの「プロパティ > C/C++ > プリプロセッサ > プリプロセッサの定義」に、"_AFXDLL"を追加 4.mainクラスのソースに以下を記述 /*----------*/ using namespace System; #include "Func.h" #using "ManagedDllApp.dll" int main() { ShowMessage(); return 0; } /*----------*/ この状態でコンパイルすると、 「エラー 3 error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 d:\xxx\Func.h 4 Console 」等、Func.h周りで複数のエラーが出ます。 また、Func.hをインポートしないでコンパイルすると、 「エラー 3 fatal error C1113: #using が 'd:\xxx\manageddllapp.dll' で失敗しました。 」と、Dllでエラーが出ます。 よろしくお願いいたします。

  • .objファイル、.lib ファイルについて

    ◆C++でのコンパイルされたプログラムの参照について。  以前、VB.netで開発をしていた時は、コンパイルをするとDLLが作成され、  それを他のプログラムからリンクして使用していました。  C++の場合h、cppのファイルをコンパイルすると、「.DLL」はできないのでしょうか? ◆.obj、.lib について  Visual Studioにて、.obj、.lib を、参照先に設定していますが、  内容をよくわかっていません。  オブジェクトリンク、ライブラリリンクとは、  (1)それぞれどんな概念なのでしょうか?  (2).obj、.libでは何が違うのでしょうか?

  • [VC++2008].dllが見つからない

    Visual Studio C++ 2008で自作DLLを使用したプログラムを作成しています。 ソースツリーが以下のようにあります。 main.cpp で #pragma comment(lib,"myutil_d.lib") #include "myutil.h" とすると、コンパイルは成功するのですが、prog1.exeを実行すると: 「myutil_d.dllが見つからなかったため、このアプリケーションを開始できませんでした。」 と出てきてプログラムが始まりません。 これを解決する方法をご教授いただけるでしょうか? (MYPROGROOT) |-include | |-myutil.h | |-lib | |-myutil_d.dll | |-myutil_d.exp | |-myutil_d.lib | |-prog1 | |-Debug | | |-prog1.exe | | |-prog1.ilk | | |-prog1.pdb | |-prog1 | | |-Debug | | | |-BuildLog.htm | | | | ... | | | | | | |-main.cpp | | |-prog1.vcproj | | | |-prog1.ncb | |-prog1.sln | |-prog1.suo | |-prog2 |-Debug | |-prog2.exe | |-prog2.ilk | |-prog2.pdb |-prog2 | |-Debug | | |-BuildLog.htm | | | ... | | | | |-main.cpp | |-prog2.vcproj | |-prog2.ncb |-prog2.sln |-prog2.suo 「>ツール>オプション>プロジェクトおよびソリューション」下 インクルード ファイル :$(MYPROGROOT)\bin ライブラリ ファイル :$(MYPROGROOT)\include もちろんmyutil_d.dllを(MYPROGROOT)\prog\Debug\ に配置するとプログラムは動くのですが、prog1, prog2, と多数のプログラムで myutil_d.dllを使用するため、バージョン管理のために統一のディレクトリで .dllファイルを管理したいと考えています。

専門家に質問してみよう