• ベストアンサー

自作ライブラリの作成方法

お世話になります。現在、C言語でプログラムを作成してますが、 自作ライブラリの作成方法について教えてください。 現在は、1つのfileにmain()と関数を両方記述してます。 (少々、見にくく解消したいのですが良い本がみつかりません) 知りたいことは、 1)ライブラリのコンパイルから作成方法 2)headerの書き方 3)それらの保存場所、他、環境設定 ※入門書は、かなり読みましたがずぶの素人です。  もし良い本があれば紹介ください。 環境は、 BCC(WINDOWS) GCC(linux) を使ってます。 宜しくお願いします。

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

他の人との共同作業ですね。分かりました。 1)ライブラリのコンパイルから作成方法 gccとbccではライブラリが違いますので兼用できません。 どちらかに固定することをお勧めします。 gccの場合はオブジェクトファイルを作って、それをarコマンドでライブラリ化します。毎度コンパイルとライブラリ作成コマンドは面倒なのでmakeを記述するほうが良いでしょう。 下記ページにある静的ライブラリを作ります。 http://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/static-libraries.html http://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/more-examples.html bccはやったことないですが、こんな感じみたいです。 http://d.hatena.ne.jp/idegman/20081226/p2 2)headerの書き方 そのライブラリに含まれる関数を呼び出すのに必要なものを記述します。 ・extern宣言の関数プロトタイプ ・#defineされた定数 ・enumの定数。 ・構造体 などです。 3)それらの保存場所、他、環境設定 コンパイル時のオプションで場所を指定できるので何処でも良いですが、標準関数と同じ場所に置くのは感心できません。専用のフォルダを用意してください。 配布方法はライブラリファイルとヘッダを渡すことになります。ソースコードはライブラリ内のデバッグしてもらわない限り不要です。

berkel
質問者

お礼

細かい説明までつけて頂きありがとうございます。 非常に助かりました。

その他の回答 (3)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

ソースコードの管理の面では、SVNやCVSを使うのが一般的です。変更履歴を管理し、多人数での作業の煩わしさを減少してくれます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

確認しますが、ライブラリファイルは何のために作るか理解されてますか? ・複数のプログラムで同じ機能を使い回したいとき。 ・作った関数の機能を他の人に提供したいとき。 ・あまりにもプログラムの一部の関数群が大きなコードなのでコンパイル単位を分けてコンパイル時間を節約したいとき。サウンド関数群とかまとまった単位でライブラリ化する。 などがライブラリを作る理由です。 質問内容を見る限りは、単にmainと関数群のファイルを分割したいだけに見えます。どうなんでしょうか?

berkel
質問者

補足

お世話になります。 現在、評価のための係数を計算するための関数を数本作って ます。具体的には、計算したデータ(float)を精度違いの固定小数点に 変換するものです。現在は、私1人で環境を作って評価しょうとしてますが、次のフェーズでは 2,3人で評価検討に使うので、そうするのが必要かなと考えます。 あとの目的としては、この機会に”Cプログラミングのスタイル”及び管理を改めたいと考えている次第です。 仕事の担当上、テスト用データを作成するためにCでプログラミングすることもありますが、ほとんど"a.out"で、その場限りのプログラミングです。 これを見直したいと考えてます。 以上、連絡致します。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

1つ確認しておきたいのですが, 「複数のソースからなるプログラム」を作ったことはありますか? もしあるとしたら, どのように操作しましたか?

berkel
質問者

補足

お世話になります。 あまり、やりませんが、 関数をextern宣言して、compileしてlinkする という操作をすることは知ってます。

関連するQ&A

  • 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ファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • gccでの分割コンパイルについて

    参考書に分割コンパイルの方法が書いてなかったので質問させていただきます。 現在3つのソースファイルがあります。 1.header.h (関数プロトタイプ宣言) 2.kansu.c  (関数の定義) 3.main.c  (main()関数) ここで、main.cがheader.hをincludeしています。 このときの分割コンパイルはどのようにしたら良いのでしょうか?Makefileを作成するのでしょうか? 自分自身分割コンパイルの経験はありません。 環境は Cygwinを使ってのWindows XP コンパイラはgcc もうひとつは Visual Studio.netを使っての環境です。

  • 静的ライブラリについて教えて下さい

    静的ライブラリについて教えて下さい。作成方法は大体わかったのですが、使い方と利用シーンがわかりません。例えば、 -main.c- #include <stdio.h> #include "abc.h" int main(){ a(); b(); c(); } -a.c- #include <stdio.h> void a(void){ printf("a\n"); } -b.c- #include <stdio.h> void b(void){ printf("b\n"); } -c.c- #include <stdio.h> void c(void){ printf("c\n"); } -abc.h- void a(void); void b(void); void c(void); というファイルを作成した上で以下のようにコンパイルしました。 gcc -c a.c gcc -c b.c gcc -c c.c これで、a.o, b.o, c.oというオブジェクトファイルが出来ました。 次にar rcs static a.o b.o c.oとコマンドを打ったところ、問題なくstaticという静的ライブラリと思われるファイルが出来ました。で、そもそもですがこの使い方がわかりません。main.cをコンパイルする際に使うのでしょうか?そもそも上で作成した静的ライブラリにはmain.oも含めるべきものでしょうか?初歩的な質問ですみません。宜しくお願いします。

  • Linuxの動的ライブラリをMacで使いたい

    64bit Linux用に提供されたライブラリ(*.a, *.so)をMac(Snow Leopard)で使いたいと思っています。Mac環境でコンパイルをしたところ、リンク時に以下のwarningが出てしまいました。 ld: warning: in xxx.so, file is not of required architecture Webで調査し、gccのオプションに-arch i386 -arch x86_64を付けてみましたが解決できませんでした。そもそも、Linux用のライブラリをMacで使うというのは無理なのでしょうか?ご回答どうぞよろしく御願いいたします。

  • バージョンの違うライブラリを適宜使い分けたい

    linux上にて、バージョンの異なるライブラリをインストールしております。このライブラリを用いて、コンパイル・実行をする際に、バージョンの違うライブラリを適宜使い分けたいのですが、どのようにすると効率的でしょうか? makeを使ってコンパイルしていますが、コンパイルの際に静的リンクを行うのが良いでしょうか?それとも、動的リンクにしておき、実行時にLD_LIBRARY_PATHを設定しなおして動かすのが良いでしょうか?あるいは、上記以外に方法があればアドバイスをもらえればと思います。

  • 分割コンパイル、ライブラリ、makeが解説されている本を探しています。

    携帯から失礼します。 C言語で分割コンパイル、ライブラリ作成、makeの使い方、デバッグ手法についてややつっこんでまとめられている本を探しています。 入門書では分割コンパイルやヘッダファイルについては巻末に少し載っているのがほとんどで、makeなどの専門書では深すぎるので、手頃に全体を網羅している本がありましたらご紹介お願いします。

  • g++コンパイルしながら使用されたヘッダー・ライブラリのフルパスを表示させたい

    宜しくお願い足します。 : posix gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5) g++: no input files の環境です。 $ g++ -o hoge hoge.cc としてコンパイルしながらにコンパイラがどのヘッダー、ライブラリを使用したかフルパスで表示させるにはどのようなオプションを指定すればいいのでしょうか?

  • ライブラリのアップデート方法を教えてください。

    Linux Centos4.7 Pakageのアップデート方法がわかりません。yumではみつからないといわれてしまいます。具体的にはgtk+-2.0を入れたいのですが。 簡単な質問かもしれませんがよろしくお願いします。ちなみに、make,installしても他のプログラムをコンパイルする際に、ライブラリバージョンが低いと言われてしまいます。

  • 共有ライブラリ作成時の -L

    sub1.c sub2.cからlibsub1.so libsub2.soを作成し、main.cをコンパイルします。 いずれのファイルも/rootにあります。 ここで gcc -c sub1.c gcc -shared -o libsub1.so sub1.o gcc -c sub2.c gcc -shared -o libsub2.so sub2.o gcc -o main main.c libsub1.so  libsub2.so だけでは [root@localhost ~]# ldd main linux-gate.so.1 => (0x0020d000) libsub1.so.1 => not found libsub2.so.1 => not found libc.so.6 => /lib/libc.so.6 (0x003e3000) /lib/ld-linux.so.2 (0x003c4000) でロードされていないので ln -s /root/libsub1.so /usr/lib/libsub1.so ln -s /root/libsub2.so /usr/lib/libsub2.so で/usr/libにシンボリックリンクを張る必要があります。 このリンクをはる作業をなんとかしてコンパイラのオプションを用いて省略したいとおもっています。 そこで gcc -o main main.c -L/root/libsub1.so -L/root/libsub2.so としたのですが /tmp/cc4Ccfom.o: In function `main': main.c:(.text+0x12): undefined reference to `print' collect2: ld はステータス 1 で終了しました make: *** [main] エラー 1 になってしまいました。 上の状況で質問は2つあります。 (1)gccのオプションを用いてシンボリックリンクを張る作業を省略するにはどうすればいいでしょうか?(私はーLの使い方を見よう見まねで用いたのですがまずかったようでエラーがでました。) (2)上のエラーは何が原因だったのでしょうか? ソースは //sub1.c #include "sub.h" int TEST=10; //sub2.c #include "sub.h" #include <stdio.h> void print(void) { if(TEST) printf("TEST is HOGE!\n"); } //main.c #include "sub.h" #include <stdio.h> int main(void) { print(); return 0; } //sub.h extern int TEST; です。 どちらかでも回答できるかたがいらっしゃれば、お願いします。

  • Windowsでも使える行列演算ライブラリについて

    プログラミングで行列演算ライブラリを使いたいのですが、開発環境が特殊でMATLABのs-functionというのを使っているため、Windows環境の行列演算ライブラリを探しております。 開発環境が特殊なためCygwinとかも使えません。今のところCLAPACK、CPPLAPACK、BOOSTを使っていますが他に使えそうなライブラリはないでしょうか?使えそうなライブラリはいつもlinuxなんです。 TwT またlinuxなどのUNIX系OSでコンパイルされた拡張子.aのライブラリファイルはWindowsではやはり使えないんでしょうか? よろしくお願いします.

専門家に質問してみよう