2017-03-23 14 views
0

GNU g++ 4.9.2 compilerSolarisLinuxの両方に使用しています。 Solarisプラットフォーム上で は、ソースファイル(AC)から共有ライブラリを作成するために、私は次のコマンドを使用します。GNU g ++ -G Linux用以外のSolarisで利用可能な共有ライブラリを作成するオプション

void libfn1() 
{ 
} 

g++ -G a.c -o a 

a、共有ライブラリ a.c次のコードが含まれてなり、 -Gオプションを使用しないとしようとすると:

g++ a.c -o a 

リンカーエラー:Undefined Symbol main

しかし、私は同じことを行う場合は、Linux上で、:それは言う:

g++: error: unrecognized command line option -G 

Linux上で共有ライブラリを作成する方法?そのためにはg++オプションは何ですか?

+1

Linuxで共有ライブラリを作成する方法は*検索*しましたか?インターネット上には多くの例とチュートリアルがあります。 –

+2

- 共有する必要があります。また、-fPICオプションと--sonameオプションも必要です。 – cleblanc

答えて

1

グラム++ドキュメントはこのことを言う:

通常

These additional options are available on System V Release 4 for compatibility with other compilers on those systems:

-G Create a shared object. It is recommended that -symbolic or -shared be used instead.

あなたは-fPICフラグを指定して、共有ライブラリのために、あまりにも位置独立コードを生成したいです。

だから、あなたが実行したいと思います:Linuxシステム上の共有ライブラリを作成するには、

g++ -fPIC -shared a.c -o liba.so 
1

プロセスは少し異なっています。

Linux上の共有ライブラリは(「共有オブジェクト」)のファイルであり、.gではありません。

あなたはこのようにそれを実行します。

まず、あなたはあなたのC++ソースからposition-independent codeを生成する必要があります。そういうわけで、あなたの図書館は、どこからでもあなたの図書館が働くからです。これを行うには、g ++の-fPICフラグを使用する必要があります。

ライブラリに含めるソースファイルごとに、位置独立コードにのみコンパイルする必要があります。後でリンクを処理します。

g++ -c -fPIC file.cpp

-cフラグGに指示++ "コンパイル、リンクしない"):ソースファイルごと

file.cppの場合、g ++は位置非依存コードを含むオブジェクトファイルfile.oを生成します。その後、共有ライブラリにオブジェクトファイルを構築するには

、あなたが

g++ -o -shared myLibrary.so {all_object_files}

ですからfile1.ofile2.ofile3.oを持っている場合は使用する必要があり、コマンドは次のようになります

g++ -shared -o myLibrary.so file1.o file2.o file3.o

もちろん、たくさんのファイルがある場合、これは面倒なので、このプロセスを自動化するMakefileを書くべきですあなたのために!ここに例があります:

myLibrary.so: file1.o file2.o file3.o 
     $(CXX) -shared $^ -o [email protected] 

file1.o file2.o file3.o : CXXFLAGS+=-fPIC 
+0

非共有オブジェクトのコンパイルフラグとしても-fPICを使用できますが、実行可能ファイルを意味しますか? –

+0

@ Dr.DebasishJana実行ファイルのフラグは、「位置独立実行可能ファイル」の-fPIEです。 -fPICはライブラリ用です。 –

関連する問題