2016-08-26 15 views
1

ncursesを使用してTUIインターフェイスを実装するスタティックライブラリを作成します。私はこの話題を初めて知り、これらの答えを適用すると、私のために が機能しませんでした。ncursesを含む静的ライブラリを作成します。

私は図書館でvarViewer.cをリンクさせたいです。私はこのコードを使ってサンプルファイルをコンパイルします。

のsrc /はexample.cをコンパイルし、SRC /ビューワ/ varViewer.c:

ビン/例にOBS/example.oのリンク
gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
    -c src/example.c -o obs/example.o -lncurses 
    -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2 
    gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
    -c src/viewer/varViewer.c -o obs/viewer/varViewer.o -lncurses 
    -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2 

gcc -o bin/example -Isrc/viewer/ 
    obs/example.o obs/viewer/varViewer.o -lncurses 
    -fsanitize=undefined -fprofile-arcs -ftest-coverage -Winline -O2 

ビン/例期待どおりに動作。

コンパイルのsrc /ビューワ/ varViewer.c:

gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
    -c src/viewer/varViewer.c -o lib/objects/varViewer.o 
    -lncurses -fPIC -O2 

とライブラリにそれを置く:私は、適切なオブジェクト・ファイルをコンパイルしようとした私は、他の中でそれを使用しよう

ar -cvr lib/libvarViewer.a lib/objects/varViewer.o 

プロジェクトは、

-Lを使用して、それを含める..../srcが/ビューワ/ libに-lvarViewer

フラグが、私はncursesライブラリと string.hのから使用される機能へのすべての参照は未定義です:

nmの/lib/libvarViewer.a

   .... 
      U __snprintf_chk 
      U __stack_chk_fail 
      U start_color 
      U stdscr 
      U strchr 
      U strlen 
      U strncmp 
      U strncpy 
      U strnlen 
      U waddnstr 
      U wborder 
      U wclear 
      U wcolor_set 
      U wgetnstr 
      U winsdelln 
      U winsnstr 
      U wmove 
      U wrefresh 

正しい方法は何ですかarに電話する?私はすでに-Tオプションを使って "薄い"ライブラリを作成しようとしました。

答えて

0

コマンド

gcc -Wall -Wextra -Wnonnull -Isrc/viewer/ 
-c src/viewer/varViewer.c -o lib/objects/varViewer.o 
-lncurses -fPIC -O2 

は単にvarViewer.cファイルをコンパイルし、それが最終的な実行可能ファイルにリンクしませんので、このように、ライブラリを無視します。

したがって、オブジェクトファイルvarViewer.oには、varViewer.c内で定義されていないシンボル(未確認のシンボル)(Unmで報告されています)が定義されています。これらは、libncursesライブラリだけでなく、通常のlibcライブラリ(strlenstrncpyなどのシンボルを提供します)を含みます。ただし、明示的に指定しない限り、libcはコンパイラによってリンクステージに自動的に追加されます。

あなた他の静的ライブラリからオブジェクトファイル(.oの)を抽出し、新しいライブラリーを作成するために、再度arを使用するコマンドar xを使用することができます。これは可能ですが、私はあなたのライブラリにすべてのライブラリを含めることは良い考えだとは思いません。私は、必要なすべてのライブラリとのリンクが良いと思うのは、アプリケーションが最新のバージョンとリンクされていることを保証するためです。一方、ライブラリをあなたのライブラリに組み込むと、アップグレードするまでそのバージョンに固執します。

+0

ありがとう:-)私はあなたの助言に従い、ncurses libにリンクしてみました。残念ながら '/ usr/lib/x86_64-linux-gnu/libncurses.a'と' gcc -I ../ viewer/lib garbage.c -L ../ viewer/lib/-lvarViewer -lを使ってリンクしようとすると:libncurses.a' 'gcc -I ../ viewer/lib garbage.c -L ../ viewer/lib/-lvarViewer -lncurses'が動作する間、私は未定義の参照をたくさん取得します。 何か不足していますか? [この質問](http://stackoverflow.com/questions/3514852/statically-link-ncurses-to-program?rq=1)によると、これはうまくいくはずです。 – anpi

+0

シンボルの定義されていない参照? – Harald

+0

私はそれを要約しようとします: 関数では、 'COLS、LINES、stdscr'のようなマクロは定義されていません。 libncursesの関数の中で、端末関連の記号(tparm、SP、cur_term、...)がありません: 例: /usr/lib/gcc/x86_64-linux-gnu/5/../../。 ./x86_64-linux-gnu/libncurses.a(lib_box.o):関数 'wborder ': (.text + 0x1f):未定義の参照' acs_map ' – anpi

関連する問題