2017-04-16 95 views
-1

我想開始使用mySQL C API來完成一個我希望完成的項目。mySQL和C的麻煩

我已經從官方網站下載了mySQL社區服務器版本和mySQL連接器/ C。

Q1:我是否還需要下載Connector/ODBC?有什麼不同?

所以,這是我的經驗和我試圖編譯和鏈接的基本程序:

#include<stdio.h> 
#include<mysql.h> 

int main(int argc, char **argv) 
{ 
    printf("MySQL client version: %s\n", mysql_get_client_info()); 

    exit(0); 
} 

我爲編譯什麼命令和鏈接,我應該使用極其混亂。當我做以下事情時,會發生這種情況:

gcc mySQL.c -I/usr/local/mysql/include 
Undefined symbols for architecture x86_64: 
    "_mysql_get_client_info", referenced from: 
     _main in mySQL-a3f748.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

有人可以幫我解決這個問題嗎?我掙扎了很多,這似乎很混亂。

我的問題是關於編譯和鏈接mySQL C API庫而不是錯誤。

+0

@Olaf我的代碼在編譯步驟中存在缺陷,這就是爲什麼關於錯誤的答案不能解決它的原因。 –

+0

這不是來自編譯,而是鏈接。並且dup很好地回答你的問題!你甚至讀過它嗎? – Olaf

回答

1

頭文件<mysql.h>只有聲明需要的函數和類型。實際功能定義(其實現)位於您需要鏈接的庫中。

你這樣做,與-l(小寫L)選項:

gcc mySQL.c -I/usr/local/mysql/include -lmysql 

但是,因爲你似乎在非標準位置安裝了MySQL,你可能需要使用-L選項指定庫中的位置(類似於-I選項):

gcc mySQL.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysql 

這至少應該讓你的程序的構建。但是如果你的MySQL庫不是一個靜態庫而是一個動態庫(即一個「DLL」),那麼可能會出現另一個問題,因爲運行時加載器不知道動態庫的位置。你也需要一個特殊的鏈接器標誌:

gcc mySQL.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysql -Wl,-rpath=usr/local/mysql/lib