Cプログラムでiniparser
という外部ライブラリを使用しようとしています。私はgcc 4.4を使用しています。リンカーエラー:未定義の共有オブジェクトへの参照
iniparser
ライブラリはlib/
というサブディレクトリにあり、ヘッダファイルはlib/iniparser/srcにあり、ライブラリはlib/iniparser/libiniparser.so.0
にコンパイルされています。
私はそれをコンパイルするために短いMakefileを書いて、ここでmake
の出力があります:gccのコンパイルに
gcc -Wall -Wextra -Werror -c -I include/ src/smag_main.c -L lib/iniparser -liniparser -I lib/iniparser/src
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/agros.c
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/main.c
gcc -Wall -Wextra -Werror -L lib/iniparser -liniparser -o agros smag_main.o main.o agros.o
smag_main.o: In function `sec_haskey':
smag_main.c:(.text+0xa9): undefined reference to `iniparser_find_entry'
smag_main.o: In function `parse_config':
smag_main.c:(.text+0x153): undefined reference to `iniparser_load'
smag_main.c:(.text+0x18b): undefined reference to `iniparser_getint'
smag_main.c:(.text+0x1c6): undefined reference to `iniparser_getstring'
smag_main.c:(.text+0x202): undefined reference to `iniparser_getstring'
smag_main.c:(.text+0x261): undefined reference to `iniparser_getstring'
smag_main.c:(.text+0x2c2): undefined reference to `iniparser_getint'
smag_main.c:(.text+0x2d5): undefined reference to `iniparser_freedict'
collect2: ld returned 1 exit status
make: *** [agros] Error 1
最初の呼び出しはsmag_main.o
成功し、もう一つはagros.o
と第三1 main.o
をコンパイルします。 4番目の呼び出しはリンカーであり、これらのオブジェクトはすべて実行可能ファイルagros
にリンクされます。明らかに失敗します。
リンク時にiniparser.so
を見つけるのに問題があるようです。私の電話はどうやって間違っていますか
私は混乱しています。
(誰かがリンクする方法を説明できる場合は、ld
を直接呼び出すとそれはすばらしいことになります)。
へのシンボリックリンクを置くことに感謝してみてください。この標準的な振る舞いですか?何故ですか? – rahmu
-liniparserコマンドを実行すると、リンカーは特定の名前のライブラリを探しています。基本的にはlibiniparser.a(静的ライブラリの場合)またはlibiniparser.so(共有ライブラリの場合)。 libiniparser.so.0という名前のファイルがある理由があります。詳細はこちら:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html – codehippo