2017-05-25 9 views
0

を実行Couldnot以下れるコードは、私はここに、GNUコンパイラで静的ライブラリと共有ライブラリをやってみましたこんにちは、動的にリンクされたプログラム

次のライブラリ calc_mean.c

double mean(double a, double b){ 
return (a+b)/2; 
} 

のコードです以下は、今私は、次のコマンドを使用して静的ライブラリを作成し始めた私のヘッダファイルcalc_mean.h

double mean(double,double); 

ある

まず、calc_mean.cは、アーカイバ(AR)はオブジェクトファイルcalc_meanのうち静的 ライブラリ(名前libmean.a)を生成するために呼び出される、オブジェクトファイルに

gcc -c calc_mean.c -o calc_mean.o 

秒になっています。その使用-fPICオプション 共有ライブラリのために必要である独立したコードを作成する前に、O

ar rcs libmean.a calc_mean.o 

第三、共有ライブラリを作成

今共有ライブラリが

#include <stdio.h> 
#include "calc_mean.h" 

int main(int argc, char* argv[]){ 

double v1,v2,m; 
v1 = 5.2; 
v2 = 7.9; 
m=mean(v1,v2); 
printf("The mean of %3.2f and %3.2f is %3.2f\n",v1,v2,m); 
return 0; 
} 

最終的に私はその静的ライブラリに対してプログラムをリンクし、次のように最終的にライブラリを使用して、私のmain.cファイルがある次のコマンドラインに

gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o 

を使用して作成され

statically_linked.exeを生成しました

gcc -static main.c -L. -lmean -o statically_linked 

動的にリンクすると、テッド私は、次のコマンドを使用して動的にリンクされたプログラムを実行するコマンドを使用するときに今、IAMのはLD_LIBRARYは、内部または外部コマンドとして認識されていないというエラーメッセージが出て、次のコマンド

gcc main.c -o dynamically_linked -L. -lmean 

とdynamically_linked.exe、実行可能なプログラムまたはバッチファイル

LD_LIBRARY_PATH=.D:\c\project3./dynamically_linked 

どのように動的リンクプログラムを実行できますか?

答えて

0

最後の行では、すべてのことをウィンドウで行うことが示唆されています。しかし、あなたは、Linuxや別の* nixプラットフォームのためのステップガイドのステップに従ったようです。

ウィンドウでは、動的にリンクされたライブラリは.dll形式(.soではありません)であり、バージョン管理規則はないため、共有ライブラリを作成するコマンドは少し違って見えるはずです。

の代わりに:

gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o 

ウィンドウで次の手順を実行します

gcc -shared -Wl,--out-implib,libmean.dll.a -o mean-1.dll calc_mean.o 

これ自体はmean-1.dllなどlibmean.dll.aという名前インポートライブラリという名前のライブラリを作成します。 Windowsプラットフォーム上のインポートライブラリ(時にはの代わりに.dll.aと呼ばれます)は、プログラムのリンク時に使用される単なるスタブですが、AFAIK MinGWでは必要ありませんが、他のコンパイラでも可能です。その後、同じコマンドで動作するはずですあなたのメインプログラムをリンク

: - ちょうど含めて、標準の検索パスでそれらを探し窓

gcc main.c -o dynamically_linked -L. -lmean 

とWindowsで.dllライブラリを見つけるためには、何もLD_LIBRARY_PATHはありませんそれを必要とする.exeのディレクトリ。 IOW、あなたはあなたのプログラムを実行できるはずです。

+0

私はcalc_mean.cとcalc_mean.hをmain.cが見つからない別のフォルダに残しておき、ライブラリを作成して別のフォルダのmain.cにリンクしたいのですが、それは実行されますか?私は途中で初心者です。 – jenny

+0

コンパイル時に '-I'フラグを使用して、正しいインクルードパスを渡すだけで、ヘッダ(' .h')をどこにでも置くことができます。同様に、リンク中に '-L'フラグを使って正しいライブラリ検索パスを渡すだけで、ライブラリを保存(インポート)することができます。 –

+0

ええええええと...... – jenny

関連する問題