操作系統:CentOS6 (32或64位)
真的是很困難,對於一個一直在windows下開發的程序員來說,在linux下想解決點問題,還真的要付出很多呀!為了在CentOS裡使用MySQL C API ,這幾天一直在不斷努力,蒼天不負有心人,終於能夠在CentOS裡使用MySQL C API 了!!!
昨天折騰到下半夜1點多,終於從另外一個方向搞定了,是安裝新版的MySQL;今天經過努力,在CentOS默認安裝環境裡,使用上系統默認安裝的MySQL,也成功配置並使用上了MySQL C API。我想我遇到的問題,可能很多朋友會遇到,尤其是剛剛進入Linux的朋友,不敢獨享,在此寫出完整處理過程,以便各位朋友能夠少走彎路,更快使用上MySQL C API !!
好了,下面就開始說說我怎麼處理的吧,我們是使用CentOS默認安裝環境裡的MySQL,並不是安裝新版MySQL。建議大家用root帳號登入,這樣修改一些東西比較方便。
1,啟動MySQL。要使用MySQL C API ,第一件事就是確認是否有MySQL和MySQL C API ,CentOS剛安裝完畢時候,如果沒有做任何修改,那麼你的系統中已經安裝了MySQL,版本為5.1.61。這時MySQL並沒有啟動,我們需要在“系統”->“管理”->“服務”中找到“mysqld”,隨後啟動它,確認啟動完畢後,在終端中輸入“mysql”就會出現MySQL的提示信息了。
2,獲得MySQL C API 的頭文件和庫。我們在終端中輸入“whereis mysql”,大家會發現並沒有一個叫“/usr/include/mysql”的目錄,這個目錄一般是開發MySQL程序的頭文件的存放目錄。沒有不要緊,我們去mysql官方網站(http://www.mysql.com/),找到“MySQL Connectors”,隨後選擇“Connector/C”,進入這個鏈接頁面後,選擇自己的操作系統和版本,我們現在用32位系統,所以選擇了32位的linux版本,是一個tar文件,具體下載鏈接:http://cdn.mysql.com/Downloads/Connector-C/mysql-connector-c-6.0.2-linux-glibc2.3-x86-32bit.tar.gz ,點擊下載完畢後,我們繼續下一步。
3,把MySQL C API 的頭文件和庫放到合適地方。首先解壓縮我們剛才下載的tar文件,解壓縮後,裡面有目錄和文件,我們只需要兩個目錄裡的文件:“include”和"lib"。
A,首先創建"/usr/include/mysql",把解壓縮目錄中的"include"目錄中所有文件,拷貝到"/usr/include/mysql"目錄中。
B,把解壓縮目錄中的"lib"目錄中所有文件,拷貝到“/usr/lib/mysql/”中。
“/usr/include/mysql”目錄存放文件是我們程序中要用到的頭文件;“/usr/lib/mysql/”目錄中存放文件是我們編譯程序時候需要鏈接的庫文件。
4,在MySQL中創建測試用的表。表名稱“ndb_test”。啟動終端,在終端中執行下列命令:
mysql -u root
use test;
create table ndb_test (user varchar(30),password varchar(30));
執行完上述語句後,我們就在MySQL中建立了一個叫“ndb_test”的表了。
5,准備測試程序。我們創建一個叫“mysql.c”的文件,在這個文件中寫上下列代碼:
#include <mysql.h>
#include <stdio.h>
int main(void) {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
/* db configure*/
char *server = "localhost";
char *user = "root";
char *password = "";
char *database = "test";
int port=3314;
conn = mysql_init(NULL);
/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, port, NULL, 0)) {
fprintf(stderr, "connect error: %s\n", mysql_error(conn));
exit(0);
}
/* send SQL query */
if (mysql_query(conn, "select * from ndb_test")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(0);
}
res = mysql_use_result(conn);
/* output table name */
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s - %s \n", row[0],row[1]);
/* close connection */
mysql_free_result(res);
mysql_close(conn);
return 0;
}
6,用GCC編譯程序。在終端中進入“mysql.c”文件所在目錄,隨後輸入:"gcc -o mydbcon -I /usr/include/mysql/ -L /usr/lib/mysql -lmysqlclient mysql.c",如果上述操作無誤,我們應該已經編譯出來一個叫"mydbcon"的可執行文件了。
7,用"mydbcon"可執行文件驗證是否可以使用MySQL C API 了。在終端中鍵入"mydbcon"可執行文件所在目錄,輸入:“./mydbcon”,如果現在一切OK,那麼我們會看到無錯誤的提示。很可能出現錯誤,^_^
錯誤提示:“error while loading shared libraries: libmysql.so.16 ”。
解決辦法:找到“/etc/ld.so.conf”文件,打開它,在文件中添加一行:“/usr/lib/mysql”。輸入這行是mysql庫文件目錄路徑,我們把mysql庫文件放到了“/usr/lib/mysql”中, 所以 在這裡添加這行內容是“/usr/lib/mysql”,如果你放到其它目錄中,請用你正確的存放MySQL庫路徑名。
隨後繼續執行可執行文件“mydbcon”,還可能會出現錯誤。
錯誤提示:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
解決辦法:
1,打開“/etc/my.cnf”文件,在末尾添加:
[mysql]
socket=/var/lib/mysql/mysql.sock”
2,在終端中輸入:"ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock"
隨後繼續執行可執行文件“mydbcon”,這個時候我們應該能夠看到沒有錯誤的提示了,和源代碼中比較,如果一致,我們的配置就算成功了,現在就可以在GCC中編譯用MySQL C API編寫的程序了。
8,在Eclipse CDT中使用MySQL C API。在Eclipse的CDT中創建一個C工程,在工程中新建一個C文件,代碼和上面一樣。隨後就是需要設置一下,打開工程的屬性,在屬性窗體左側點“C/C++ Build”->"settings",隨後在右側的“tool settings”tab頁裡進行設置。
a,“GCC C Complier”->"inclues"->"include pathes(l)"中添加一項“/usr/include/mysql”。注意,這個地方是上面那個,不是下面那個。
b,“GCC C Complier”->"Miscellaneous“->"Other flags"中增加“-std=c99”。
c,“GCC C Linker”->"libraries"->"libraries"中增加一項“mysqlclient”。
d,“GCC C Linker”->"libraries"->"librariy search path"中增加一項“/usr/lib/mysql”。
以上各項全部配置完畢後,保存退出配置頁面,隨後編譯,應該沒有錯誤,隨後運行編譯出來的可執行文件,和GCC編譯出來的執行結果一樣,我們終於可以在Eclipse CDT中使用MySQL C API了!!!