プロジェクトをコンパイルしようとしていますが、undefined reference
エラーが発生します。例えば。:
installertest.cpp:(.text+0x9d1): undefined reference to `XmlRpcValue::makeArray()'
...
installertest.cpp:(.text+0xede): undefined reference to `dbcancel'
installertest.cpp:(.text+0xefd): undefined reference to `dbfcmd'
installertest.cpp:(.text+0xf0f): undefined reference to `dbsqlexec'
installertest.cpp:(.text+0xf2d): undefined reference to `SHA1_Init'
...
私のコマンドラインは次のとおりです。
g++ -o installertest \
-lsybdb \
-lxmlrpc \
-lxmlrpc_cpp \
-lxmlrpc_xmlparse \
-lxmlrpc_xmltok \
-lxmlrpc_util \
-lxmlrpc++ \
-lxmlrpc_server_cgi \
-lssl \
-std=c++0x \
ContractData.o installertest.o
objdump -T
シンボルが.soファイルにあることを示しています。例えば。:
libsybdb.so:
...
0000000000011c30 g DF .text 0000000000000083 Base dbcancel
...
/usr/lib/libxmlrpc_cpp.so:
...
0000000000002e78 g DF .text 0000000000000092 Base _ZN11XmlRpcValue9makeArrayEv
...
strace
ライブラリファイルがリンカーによって開かれ、読み取られていることを示します。
...
[pid 5019] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libsybdb.so", {st_mode=S_IFREG|0644, st_size=421608, ...}) = 0
[pid 5019] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libsybdb.so", O_RDONLY) = 7
[pid 5019] fcntl(7, F_GETFD) = 0
[pid 5019] fcntl(7, F_SETFD, FD_CLOEXEC) = 0
[pid 5019] fstat(7, {st_mode=S_IFREG|0644, st_size=421608, ...}) = 0
[pid 5019] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b16c200c000
[pid 5019] lseek(7, 0, SEEK_SET) = 0
[pid 5019] read(7, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\237\0\0\0\0\0\0"..., 4096) = 4096
...
[pid 5019] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libxmlrpc.so", {st_mode=S_IFREG|0644, st_size=80936, ...}) = 0
[pid 5019] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libxmlrpc.so", O_RDONLY) = 8
[pid 5019] fcntl(8, F_GETFD) = 0
[pid 5019] fcntl(8, F_SETFD, FD_CLOEXEC) = 0
[pid 5019] fstat(8, {st_mode=S_IFREG|0644, st_size=80936, ...}) = 0
[pid 5019] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b16c200d000
[pid 5019] lseek(8, 0, SEEK_SET) = 0
[pid 5019] read(8, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300?\0\0\0\0\0\0"..., 4096) = 4096
...
関連するすべてのファイルはx86-64を対象としており、Cライブラリのヘッダーはextern "C"
です。私は考えられるすべてを試しましたが、それでもリンクしません。
すべてのC++11コードを削除し、コマンドラインスイッチなしでコンパイルしようとしましたが、それでも何もありません。
私のシステムはUbuntuPrecise (12.04)64ビットでg ++(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3を使用しています。すべてのパッケージはパッケージマネージャーからインストールされ、開発パッケージがインストールされます。
編集(2017-05-30):https ://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-inの複製としてマークされています-gcc
他の質問は、引数の順序が重要である理由を尋ねます。質問されたとき、議論の順序が問題になることは知られていませんでした。
また、前の質問には有用な拡張が含まれていませんが、この質問は目前の問題を示しています。
前の質問は、これに対する答えの有用な拡張と見なされる場合がありますが、重複ではありません。