2017-01-07 3 views
0

gccの文書化と同様の質問をたくさん読んだ後、私の問題は残っています。
私のプロジェクトにlibluajit.aを静的にリンクしようとしていますが、試してみるコマンドの組み合わせに関係なく、1つまたは別のエラーがポップアップします。私は正常にダイナミックリンクで私のプロジェクトをコンパイルしました。今
アイデアのうちイムのでHERESに私は今得たもの:gccと静的にリンクしているときに "dlopenへの未定義の参照"

gcc_options = -std=c++11 -static -pthread 

src_dir = LuaHost 
src_files = $(src_dir)/*.cpp 
src_files += $(src_dir)/*.h 
src_files += $(src_dir)/LuaSrc/*.h 
src_files += $(src_dir)/LuaSrc/*.hpp 

lib_cmd = -Wl,--no-as-needed -ldl -L./$(src_dir)/LuaSrc/ -lluajit 

#compile everything and output an executeable 
all: 
    g++ $(gcc_options) $(src_files) $(lib_cmd) -o LuaJITSandbox.o 

そしてHERESにエラーの一部:

./LuaHost/LuaSrc/libluajit.a(lj_clib.o): In function `lj_clib_index': 
lj_clib.c:(.text+0x1c0): undefined reference to `dlsym' 
./LuaHost/LuaSrc/libluajit.a(lj_clib.o): In function `lj_clib_load': 
lj_clib.c:(.text+0x2c8): undefined reference to `dlopen' 
lj_clib.c:(.text+0x350): undefined reference to `dlerror' 
lj_clib.c:(.text+0x424): undefined reference to `dlopen' 

libluajit.aが同じマシン上でコンパイルされている、AラズベリーPi。

+0

リンク時のライブラリの順序は重要です。ライブラリAがライブラリBに依存している場合、コマンドラインでAは* Bの前に来なければなりません。 –

+2

リンクコマンド*に '-ldl'を追加します。出力の後ろにあるので、最後まで移動してみてください。 – Galik

+0

@Galik Nope、エラーは変更されません。もし私の命令の命令を混乱させれば、それは何も変えなかった。 – Flowx

答えて

1

私は-staticはあなたの後ではないと思います。 -staticstatic applicationを構築し、の平均link this static library to the applicationではありません。

ここにはいくつかのオプションがあります。 -lluajitとリンクすると、ライブラリの動的.soバージョンを削除できます。 gccはデフォルトでダイナミックリンクを行いますが、ダイナミックライブラリが利用できない場合や見つからない場合は静的リンクにフォールバックします。

-lluajitの代わりに、静的ライブラリファイルをオブジェクト入力ファイル(/usr/lib/libluajit.a)として直接処理することができます。

私は、リンカーにあなたのライブラリをリンクする方法を伝えることをお勧めします。 -Wl,-Bstatic -lluajitを使用してください。複数のライブラリにリンクして別々にリンクする場合は、BstaticBdynamicをライブラリ名のすぐ前に切り替えることができます。

関連する問題