私の要件は、いくつかのインターフェイスの.hファイルで作業することです。今は私のプロジェクトに.hと.cpp/.ccファイルがあります。C++コードの共有64ビットLinux互換ライブラリ(* .so)の作成方法
Linux FedoraでNetBeans/Eclipseを使用して、共有64ビットLinux互換ライブラリ(* .so)にコンパイルする必要があります。
私の要件は、いくつかのインターフェイスの.hファイルで作業することです。今は私のプロジェクトに.hと.cpp/.ccファイルがあります。C++コードの共有64ビットLinux互換ライブラリ(* .so)の作成方法
Linux FedoraでNetBeans/Eclipseを使用して、共有64ビットLinux互換ライブラリ(* .so)にコンパイルする必要があります。
a.cc、b.cc、c.ccという3つのC++ソースファイルからライブラリをコンパイルする場合は、
g++ -fpic -Wall -c a.cc
g++ -fpic -Wall -c b.cc
g++ -fpic -Wall -c c.cc
g++ -shared -Wl,-soname,libmylib.so.0 -o libmylib.so.0.0.0 a.o b.o c.o
その後、あなたは、ldconfigコマンドを使用してライブラリをインストールします(次のように
man 8 ldconfig
は、あなたがしてlibaryを使用するプログラムをコンパイルすることができを参照してくださいが、ヘッダファイル内のクラスの宣言の前に
extern "C"
を接頭辞にしてくださいライブラリを使用してソースコードに含まれる。)
グラム++ -o MYPROG main.cc -lmylib
私は自分のサンプルコードでこれらのコンパイルオプションを試してみて成功しました。
基本的にはShared LibrariesがC++に適用されます。gccをg ++に置き換えてください。
このすべての背後にある理論は、
ライブラリーは、プログラムのロード時に動的にロードされます。実行中のプログラムでシステムコールトレースを実行することで確認できます。 strace -o trace.txt ls
は、プログラムが実行中に作成したシステムコールのリストをtrace.txtというファイルにダンプします。ファイルの先頭には、プログラム(この場合はls
)がすべてのライブラリをメモリに実際にmmapしていることがわかります。
ライブラリは動的にロードされるため、実行時にライブラリのコードがプログラムの仮想アドレス空間に存在するリンク時は不明です。したがって、位置独立コードを使用してライブラリコードをコンパイルする必要があります。したがって、翻訳ステージに位置独立コードを念頭にしてコーディングされたアセンブリコードを生成するように指示するオプションの-fpic
があります。 gcc/g++
に-S
(大文字のS)オプションを指定して翻訳ステージの後に停止し、結果の '.s'ファイルを表示すると、-fpic
オプションを指定すると一度だけ違いが表示されます動的コードには少なくともx86_64では@GOTPCRELと@PLTがあります)。
リンカはもちろん、すべてのELF再配置可能オブジェクトタイプをLinux共有ライブラリとしての使用に適した実行可能コードにリンクするように指示する必要があります。
あるGCCバージョンから次のGCCバージョンへ(例えば、g++-4.4
からg++-4.6
へ)、GCC C++ ABIの規約が少し変わった(特にC++標準ライブラリの進化、またはネームマングリング規約のため)共有ライブラリは、 g++
のバージョンは、それを構築するために使用
あなたは、シンボルは、あなたが好ましくべきdlsymと公にアクセスできるようにしたい場合(実際には、変更はG ++、あなたが非影響を受ける可能性がありますので、内部の多くの場合、小さいです)あなたにextern "C"
と宣言してくださいrヘッダファイル(それ以外の場合はmangle its name)。
共有ライブラリを作成する方法については、Program Library Howtoのようなドキュメントを参照してください。
を参照してください。そして、私は(例えばMakefile
-s)通常のコマンドラインツールを使用して共有ライブラリを構築示唆しています。 NetBeans/Eclipseのような複雑なIDEに依存しないでください(コマンドラインユーティリティが呼び出されています)。
Netbeans/Eclipseを使ってみませんか?彼らは物事を簡単にする。 Visual Studioでもコマンドラインを使用していますが、誰かがコマンドラインからWindows上で何かをコンパイルしてリンクするという勧告を聞いたことはありません。 –
はい、このスレッドは、unix/linuxの共有コード/ライブラリについてです。コマンドラインからコンパイルするのが一般的です。実際には、特定のコンパイルコマンドはmakeファイルにありますが、コマンドラインから起動されるmakeユーティリティだけですが、通常はmakeなどの非常に簡単なコマンドを使用します。 – vyudh
gccをシンプルで使いやすいものにします。 – Deepak