2017-01-04 16 views
0

C++とLeptonicaをリンクする際に奇妙な問題があります。通常の関数呼び出しはうまくいきますが、私はもともと.soライブラリに公開されていなかったライブラリの関数が必要です。だから私はソースで2つの興味深い関数を検索し、のstaticキーワードを削除したので、露出したものと似ています。私はきれいにした後、完全な図書館を作り直しました。 .soファイルがOKになります。シンボルは.soでコンパイルされていますが、リンクは失敗しますが、リンクは失敗します。

 
nm liblept.so.5.0.0 
... 
000000000009d010 T dewarpGetMeanVerticals 
000000000009d160 T dewarpGetTextlineCenters 
000000000009d8f0 T dewarpIsLineCoverageValid 

は、ファイルをの.oためにコンパイルし、それを観察する:

 
g++ -c -std=c++11 -I../leptonica/src/src/ preproc.cpp -L../leptonica/src/.libs/ -llept -o preproc 
nm preproc 
... 
U dewarpGetMeanVerticals 
U dewarpIsLineCoverageValid 

私は何

 
/tmp/ccCPqS1R.o: In function `_dewarpGetTextlineCenters(Pix*, int)': 
preproc.cpp:(.text+0x3d5): undefined reference to `dewarpGetMeanVerticals' 
/tmp/ccCPqS1R.o: In function `_dewarpBuildPageModel(L_Dewarp*, char const*)': 
preproc.cpp:(.text+0x81d): undefined reference to `dewarpIsLineCoverageValid' 
collect2: error: ld returned 1 exit status 

で-cフラグの結果なしで同じコンパイル中間違っている?

は、事前にありがとう:バラージュ

+0

私はliblept.so.5.0.0にあるものとliblept.soとのリンクを見せていることに気付きました。正しい.soファイルにリンクするようにシンボリックリンクを更新する必要がある可能性はありますか? – cleblanc

+0

'nm'はここでは最適なツールではありません。' readelf --dyn-syms -W'を試してみてください。 – yugr

+1

[定義されていない参照/未解決の外部シンボルのエラーとは何ですか?どうすれば修正できますか?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-シンボルエラーとハウツーi-fix) – Olaf

答えて

0

私はあなたがそうでそれらを公開したい場合は、それらの機能の周りにextern「C」のキーワードを必要とするかもしれないと思います。名前が.soのC++コンパイラによってマングルされているようには見えないので、おそらくそうではありません。

私はliblept.so.5.0.0にあるものとliblept.soとのリンクを表示していることに気付きました。正しい.soファイルにリンクするようにシンボリックリンクを更新する必要がある可能性はありますか?

+0

一方、app内のシンボルはマングルされているように見えます(そうでなければ、リンカーはその型を知らないでしょう)。アプリケーションコードのOPに "extern" C "がありませんか? – yugr

+0

これはコメントであり、答えではありません。 – Olaf

関連する問題