15

新しいサーバーでプログラムをコンパイルしようとしていますが、現時点ではうまくいきません。

エラーログは次のとおりです。

rasmus@web01:~/c++$ make test
g++ `mysql_config --cflags --libs` main.cpp logger.cpp cpulogger.cpp -o test
/tmp/ccPaMZUy.o: In function `CPULogger':
/home/rasmus/c++/cpulogger.cpp:7: undefined reference to `mysql_init'
/home/rasmus/c++/cpulogger.cpp:8: undefined reference to `mysql_real_connect'
/home/rasmus/c++/cpulogger.cpp:10: undefined reference to `mysql_get_client_info'
/tmp/ccPaMZUy.o: In function `~CPULogger':
/home/rasmus/c++/cpulogger.cpp:16: undefined reference to `mysql_close'
collect2: ld returned 1 exit status
make: *** [all] Error 1

ご覧のとおり、MySQL に対してコンパイルしています。mysql.h がインクルード パスに存在することを確認しました。

私は何が欠けていますか?

cpulogger.cpp の先頭に #include "cpulogger.h" があり、cpulogger.h は次のようになります。

#include <iostream>
#include <fstream>
#include <mysql/mysql.h>

コンパイラは mysql/mysql.h の欠落について文句を言わないので、その部分は機能するはずですか?

mysql_config の出力:

rasmus@web01:~/c++$ mysql_config --cflags --libs
-I/usr/include/mysql -DBIG_JOINS=1  -fno-strict-aliasing  -g
-L/usr/lib -lmysqlclient -lpthread -lz -lm -lrt -ldl

メイクファイル:

all:
    g++ `mysql_config --cflags --libs` main.cpp logger.cpp cpulogger.cpp -o test


test: all
    ./test

これは、mysql-server がインストールされた Ubuntu サーバーの新規インストールです。

[解決済み]:

コンパイラ コマンドの最後にリンカー ライブラリを配置すると機能します。

all:
    g++ main.cpp logger.cpp cpulogger.cpp -o test `mysql_config --cflags --libs`

説明については、以下の回答を参照してください。

4

1 に答える 1

17

リンカーへの引数の順序は重要です。mysql-configが必要なファイルを一覧表示した後、mysql-config を使用します。リンカは、cpulogger.o が mysql_init を必要とすることを確認し、その後にリストされているライブラリでシンボルを探します。ライブラリが引数の前にリストされている場合、再度検索されることはありません。

于 2012-06-10T16:46:23.883 に答える