別のシミュレーションツールで別の.cpp
ファイルに定義されている機能を使用可能にしたいと考えています。cppをコンパイルして共有ライブラリにリンクする方法
私はこの質問に次のコードを見つけました:-finstrument-functions doesn't work with dynamically loaded g++ shared objects (.so)
Trace.cpp
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
void __cyg_profile_func_enter(void *this_fn, void *call_site)
__attribute__((no_instrument_function));
void __cyg_profile_func_exit(void *this_fn, void *call_site)
__attribute__((no_instrument_function));
}
#endif
void __cyg_profile_func_enter(void* this_fn, void* call_site)
{
printf("entering %p\n", (int*)this_fn);
}
void __cyg_profile_func_exit(void* this_fn, void* call_site)
{
printf("exiting %p\n", (int*)this_fn);
}
Trace.cppを実行してコンパイルされています。私はドン
g++ -g -finstrument-functions -Wall -Wl,-soname,libMyLib.so.0 -shared -fPIC -rdynamic MyLib.cpp MyLibStub.cpp Trace.cpp -o libMyLib.so.0.0
ln -s libMyLib.so.0.0 libMyLib.so.0
ln -s libMyLib.so.0.0 libMyLib.so
g++ MainStatic.cpp -g -Wall -lMyLib -L./ -o MainStatic
g++ MainDynamic.cpp -g -Wall -ldl -o MainDynamic
注意」を必要性:MyLib.cpp
およびMyLibStub.cpp
。
g++ -g -finstrument-functions -Wall -Wl,-soname,libMyLib.so.0 -shared -fPIC -rdynamic Trace.cpp -o libMyLib.so.0.0
を私が試した何:
opp_makemake -f --deep --no-deep-includes --make-so -I . -o veins -O out -I../../inet/src/util/headerserializers/sctp/headers -L../../inet/src -linet
:私はTrace.cpp
を持ちたい
共有オブジェクトをすることによって得られる代わりにTrace.cpp
がやってコンパイル
私はを追加しましたと-l
:
opp_makemake -f --deep --no-deep-includes --make-so -I . -o veins -L /home/user/Desktop/test/ -lMyLib -O out -I../../inet/src/util/headerserializers/sctp/headers -L../../inet/src -linet
となった:
は/ usr/binに/ ldは:
コンパイルopp_makemake -f --deep --no-deep-includes --make-so -I . -o veins /home/user/Desktop/test/libMyLib.so.0.0 -O out -I../../inet/src/util/headerserializers/sctp/headers -L../../inet/src -linet
:私も試した-lmylib
を見つけることができません正常に終了しましたが、アプリケーションがクラッシュしました:
起動時にエラー:ライブラリ を読み込むことができません「../../src//libveins.so」:libMyLib.so.0は:そのようなファイルやディレクトリはありません:共有オブジェクト ファイルを開くことができません。
質問:
- 正しく
Trace.cpp
をコンパイルする方法は? - 他の共有ライブラリとリンクするにはどうすればいいですか?
あなたが気づいているように、私はコンパイルやリンクなどの経験はあまりありません。だから、余分な説明は大歓迎です!
あなたが他の場所でコメントで尋ねた質問への答えあなたがリンクしている質問には、「あなたは自分の__cyg_profile_func_enterをlibc.so.6のどこかに置く必要があります。それを実行する一つの方法は、あなたのメインの実行可能ファイルにリンクすることです。あなたの実行可能ファイルに直接リンクされています(つまり、dlopen()ではありません)。 "それ以外のこの質問は、一般的な "どのようにリンクするのですか?"これは選択したビルドツールのドキュメントでカバーされています。 – Flexo
ええと、それは私が今把握しようとしているものです。トリッキーな部分は、私が使っているツールが最終的に3つのシミュレーションツールを一緒に "マージ"するスクリプトを使ってmakefileを生成することです。最終的なmakeは次のようなものです:http://pastebin.com/EiXGiHbK ... so本当の疑問は、 'libc.so.6'の実装の前に私の実装をどうやって置くのですか? :/ – cross