2016-08-10 8 views
0

共有ライブラリに、main()ハンドラ()ルーチンのみを提供する実行可能ファイルの作成ルーチンを含めるにはどうすればよいですか?main()で共有ライブラリをハンドラ関数のみを提供する実行可能ファイルにリンクする

[email protected]:/media/Workspace/eclipse/libMain$ cat Makefile 

main.so: main.cpp 
    gcc -shared -o main.so -fPIC main.cpp 

libMain.so: main.so 
    gcc -shared -o libMain.so main.so 

test1: libMain.so test1.o 
    g++ -o test1 test1.o -L. -lMain 

test2: libMain.so test2.o 
    g++ -o test2 test2.o -L. -lMain 

all: test1 test2 

clean: 
    rm -f test1 test2 libMain.so *.o *.so 

[email protected]:/media/Workspace/eclipse/libMain$ cat main.cpp 

void DoSomething(void); 

int main(int, char **) 
{ 
    DoSomething(); 
    return 0; 
} 

[email protected]:/media/Workspace/eclipse/libMain$ cat test1.cpp 
#include <iostream> 

void DoSomething(void) 
{ 
    std::cout << "hello from test1" << std::endl; 
} 

[email protected]:/media/Workspace/eclipse/libMain$ cat test2.cpp 
#include <iostream> 

void DoSomething(void) 
{ 
    std::cout << "hello from test2" << std::endl; 
} 

これは動作します:

> G ++ -o test1のtest1.o main.so
をメイン()main.so である。しかし、それはlibMain.soではもう利用できませんので(?!)

答えて

2

main機能を共有ライブラリに置くことは技術的に間違っていますが、何らかの形で最後の実行可能ファイルが「最後」になる限り問題はありません。それは変わった、慣習的ではなく、おそらく非常に混乱しますが、技術的にはうまくいかない理由はありません。

しかし、あなたはここに何を持っています2つの共有ライブラリ - libMain.somain.soです。前者は後者へのリンク以外は実際に何もしません。問題は、共有ライブラリが別の共有ライブラリを「インクルード」しないことです。—それは依存関係ツリーを拡張するだけです。それはどの機能も「含む」わけではありません。これらの機能は、依然としてmain.soにのみ存在します。

したがって、最終実行ファイルはmain.soにリンクする必要があります。

私は何もしていないので、libMain.soを失うことをお勧めします。 gccg++ではなく)を使用してC++コードをコンパイルする場合は、C++標準ライブラリランタイムをリンクすることはできませんので、修正してください。

+0

2番目の共有オブジェクトファイルを完全に削除するには、 'gcc -shared -o libMain.so -fPIC main.cpp'を直接使うことができます – oldrinb

2

libMain.somain.soに、libMain.somain.soのシンボルにリンクしている可能性があります。

2つの溶液が頭に浮かぶ:-rフラグでmain.so

  1. リンクlibMain.sogcc -shared -r -o libMain.so main.so
  2. リンクlibMain.somain.o.soではなくオブジェクトファイル)。

また、C++コードのコンパイルとリンクにはg++を使用することをお勧めします。

+1

TIL about '-r' - 非常に興味深い、ありがとう! –

関連する問題