2013-04-14 12 views
15

是的這個問題已經問過...我已經嘗試了前面的答案中提到的一切。我的設置非常簡單,所以這不應該太難。C++/mysql連接器 - 未定義的引用get_driver_instance - 已經嘗試了簡單的東西

我只是想用C++編程對付mysql。我的源代碼是採取verbatem從「世界你好」類型這裏例如:

http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-examples-complete-example-1.html

我在Ubuntu 12.10。我想:

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0 -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn firsttry.cpp 

它編譯(如果我使用-c選項),但不會建立,給我臭名昭著:

/tmp/ccn768hj.o: In function `main': 
firsttry.cpp:(.text+0x3a): undefined reference to `get_driver_instance' 

的一些細節:

  • 'firsttry.cpp'正是我命名的源代碼文件,再次從官方示例中取出verbatem
  • 正如你所見, mysqlclient庫和mysqlcppconn庫。很多時候,當這個問題被問到以前,答案就是把這些問題聯繫起來。
  • 一些其他歷史答案表明示例源代碼是錯誤的,並且該問題的函數需要在sql :: mysql命名空間等。我很確定源代碼是好的。再次,它編譯,並且更改源代碼中的名稱空間似乎使情況變得更糟。

非常感謝您提供任何幫助。

+1

那是什麼'-l:libmysqlclient_r.so.18'?它不應該是'-lmysqlclient_r'嗎? –

+0

感謝Haroogan。我從[鏈接](http://stackoverflow.com/questions/335928/ld-cannot-find-an-existing-library)得到了--l:business - 我相信這只是一種指定完整文件名稱的方式,當傳統命名風格中的符號鏈接不存在,因爲它不適合我。所以如果我嘗試了-lmysqlclient_r,它告訴我它找不到-lmysqlclient_r。 根據您的反饋,我繼續前進並創建了符號鏈接,現在我可以使用-lmysqlclient_r ...並獲取與「get_driver_instance」相同的錯誤。任何其他想法? –

+0

嘗試先將'firsttry.cpp'編譯爲'firsttry.o',然後將其與這些MySQL庫鏈接到可執行文件中。即像這樣:'g ++ -Wall -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0 -o firsttry.o firsttry.cpp'和'g ++ firsttry.o -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn -o firsttry'。 –

回答

27

所以我現在有這個問題已經有一個星期了,我對它也很沮喪。我現在才能夠最終構建一個除了登錄到mysql之外什麼都不做的程序,我從字面上聽起來很高興。這是我的,我希望它有幫助。

我第一次編譯從源代碼,但有一段時間我想也許我做錯了什麼之後,C++連接庫,所以我然後只用apt用得到它:

sudo apt-get install libmysqlcppconn-dev 

這裏是我的簡單測試源文件「tester.cpp」

#include <stdlib.h> 
#include <iostream> 
#include <mysql_connection.h> 
#include <driver.h> 
#include <exception.h> 
#include <resultset.h> 
#include <statement.h> 

using namespace sql; 
int main(void){ 
    sql::Driver *driver; 
    sql::Connection *con; 

    driver = get_driver_instance(); 
    con = driver->connect("tcp://127.0.0.1:3306","root","YOURPASSWORD"); 

    return 0; 
} 

最後克++編譯命令:

sudo g++ -Wall -I/usr/include/cppconn -o testapp tester.cpp -L/usr/lib -lmysqlcppconn 

這對我有用,我希望它可以幫助你解決你的問題!

+1

是的 - 工作!非常感謝你。具體來說,有效的方法是通過'apt-get install'來獲得庫,而不是(A)試圖從源代碼構建它(不適用於你),或者甚至(B)從MySQL站點下載庫,把我自己的文件夾放進去(不適合我)。非常感謝你! –

+0

雖然這個問題已經解決,但我仍然對第一次做錯的事情感到好奇。當然,我在C++和Linux上都很生疏,所以也許這是一個真正的新錯誤。我最好的猜測是它必須與目錄位置有關......'apt-get install'將_mysqlcppconn_權限放在/ usr/lib的根目錄中,而我在子目錄中等等。但是不應該這樣,只要我在創建程序時指定完整路徑,我就是這樣?即使在編譯階段,它也告訴我,我還需要指定Boost等... –

+0

偉大的解決方案,即使我需要先刪除現有的libmysqlcppconn-dev,然後按照您的說法操作。經過兩天的努力,我們的作品已經完成!我不知道什麼mysql人保留在他們的文檔.. – Catty

8

對我來說,簡單地交換最後兩個參數的順序解決了這個問題。我不知道爲什麼,但如果我在源文件後面指定-lmysqlcppconn選項,鏈接器能夠找到函數get_driver_instance

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -L/usr/lib/mysqlcppconn firsttry.cpp -lmysqlcppconn 

另外請注意,我拿出下列選項,因爲我認爲他們是多餘的

-I/usr/local/boost_1_53_0 -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 
+0

您的解決方案爲我工作,非常感謝! – Purefan

+0

是的,這也適用於我,就像所描述的那樣,將鏈接標誌移動到命令的末尾而不刪除任何其他標誌 - 有誰知道如何? – Brizee

1

如果所有路徑都包含扔PARAM -I。你會看到是否有問題,如果你這樣進行編譯:

g++ -g -o0 -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o 
g++ -g -o0 -L/usr/local/lib -L/usr/local/mysql/lib -lmysqlcppconn main.o -o test 

將出現該問題:

main.o: In function `main': 
/home/huangxw/workspace/public/soal/test/main.cpp:165: undefined reference to `get_driver_instance' 
collect2: ld returned 1 exit status 

現在你必須調整的-lmysqlcppconnmain.o順序:

g++ -g -o0 -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o 
g++ -g -o0 -L/usr/local/lib -L/usr/local/mysql/lib main.o -o test -lmysqlcppconn 

這就是全部! 原因很簡單。你可以找到使用網絡或要求我詳細說明。

+0

我對兩個問題感到困惑。 1)爲什麼這會有所作爲,2)我應該如何使用autotools/automake指定它是在我的「main.o」之後出現的? – Discordanian

4

如果你是和我一樣健忘和的CMakeLists.txt沒有鏈接庫:

target_link_libraries(<target> mysqlcppconn) 
+1

嗨,''應該是什麼?我也使用CMakeLists.txt,你的答案是最有可能救我的。 –

+0

目標是您在add_executable(myproj)之後使用的名稱。在這種情況下myproj。 https://schneide.wordpress.com/2016/04/08/modern-cmake-with-target_link_libraries/ – user584583

+0

http://osdevlab.blogspot.com/2016/02/how-to-install-mysql-connectorc-on html的 – user584583

相關問題