2013-04-14 31 views
15

Có câu hỏi này đã được hỏi trước đây ... Tôi đã thử mọi thứ được đề cập trong các câu trả lời trước. Thiết lập của tôi thực sự đơn giản nên điều này không quá khó.C++/mysql Connector - tham chiếu không xác định đến get_driver_instance - đã thử công cụ dễ dàng

Tôi chỉ muốn chương trình chống lại mysql bằng C++. mã nguồn của tôi được lấy verbatem từ 'hello world' loại ví dụ ở đây:

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

tôi trên Ubuntu 12.10. Tôi đang cố gắng:

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 

Nó biên dịch (nếu tôi sử dụng tùy chọn -c) nhưng sẽ không xây dựng, đem lại cho tôi khét tiếng:

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

Một vài chi tiết:

  • 'firsttry.cpp' chỉ là những gì tôi đã đặt tên cho tệp mã nguồn, một lần nữa lấy verbatem từ ví dụ chính thức
  • Như bạn có thể thấy I AM liên kết trong thư viện mysqlclient và thư viện mysqlcppconn. Nhiều khi câu hỏi này được hỏi trước đây, câu trả lời là liên kết chúng.
  • Một số câu trả lời lịch sử khác cho thấy mã nguồn mẫu sai và chức năng đang được đề cập cần phải ở trong sql :: không gian tên mysql, v.v. Tôi khá chắc chắn rằng mã nguồn là tốt. Một lần nữa, nó biên dịch và thay đổi các không gian tên trong mã nguồn dường như làm cho nó tồi tệ hơn.

Cảm ơn bạn trước vì bất kỳ trợ giúp nào bạn có thể cung cấp.

+1

gì mà '-l: libmysqlclient_r.so.18'? Nó không phải là '-lmysqlclient_r'? –

+0

Cảm ơn Haroogan. Tôi nhận được rằng -l: kinh doanh từ [link] (http://stackoverflow.com/questions/335928/ld-cannot-find-an-existing-library) - Tôi tin rằng nó chỉ là một cách để chỉ định một tên tập tin đầy đủ khi một liên kết tượng trưng trong phong cách đặt tên thông thường không tồn tại, vì nó không dành cho tôi. Vì vậy, nếu tôi đã thử -lmysqlclient_r, nó nói với tôi nó không thể tìm thấy -lmysqlclient_r. Dựa trên phản hồi của bạn, tôi đã tiếp tục và tạo liên kết tượng trưng, ​​bây giờ tôi có thể sử dụng -lmysqlclient_r ... và tôi gặp lỗi tương tự về 'get_driver_instance'. Bất kỳ suy nghĩ nào khác? –

+0

Cố gắng biên dịch 'firsttry.cpp' thành' firsttry.o' trước, và sau đó liên kết nó với các thư viện MySQL đó vào tệp thực thi. I E. như thế này: 'g ++ -Wall -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0 -o firsttry.o firsttry.cpp' và' g ++ firsttry.o -L/usr/lib/x86_64-linux-gnu -l: libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn -o firsttry'. –

Trả lời

27

Vì vậy, hiện tôi đã gặp sự cố này trong một tuần và tôi cũng rất thất vọng với nó. Tôi vừa mới có thể xây dựng một chương trình không làm gì ngoại trừ việc đăng nhập vào mysql và tôi thực sự hét lên với niềm vui. Đây là những gì tôi có và tôi hy vọng nó sẽ giúp.

đầu tiên tôi biên soạn C++ thư viện kết nối từ nguồn nhưng sau một thời gian tôi nghĩ có lẽ tôi đã làm điều gì sai vì vậy tôi sau đó chỉ cần sử dụng apt để có được nó với:

sudo apt-get install libmysqlcppconn-dev 

Và đây là đơn giản tập tin nguồn thử nghiệm của tôi "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; 
} 

Và cuối cùng g ++ biên dịch lệnh:

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

Điều này làm việc cho tôi và tôi hy vọng nó sẽ giúp bạn giải quyết vấn đề của bạn!

+1

Có - đã hoạt động! Tuyệt vời cảm ơn bạn.Cụ thể, những gì làm việc là nhận thư viện thông qua 'apt-get install' thay vì (A) cố gắng xây dựng nó từ mã nguồn (không làm việc cho bạn) hoặc thậm chí (B) tải xuống thư viện từ trang MySQL và đặt trong thư mục bản thân mình (không làm việc cho tôi.) Cảm ơn bạn rất nhiều! –

+0

Trong khi câu hỏi này được giải quyết, tôi vẫn còn lại với một sự tò mò cháy bỏng về những gì tôi đã làm sai ở nơi đầu tiên. Cấp cho tôi một chút gỉ trên C + + của tôi và mới cho Linux, vì vậy có lẽ đây là một sai lầm mới thực sự. Đoán tốt nhất của tôi là nó phải có một cái gì đó để làm với các địa điểm thư mục ... 'apt-get install' đặt quyền _mysqlcppconn_ trong thư mục gốc của/usr/lib trong khi tôi đã có trong một thư mục con vv Nhưng không phải là không sao, miễn là tôi đã xác định đường dẫn đầy đủ khi tôi xây dựng chương trình, tôi là ai? Ngay cả ở giai đoạn biên dịch, nó đã nói với tôi rằng tôi cũng cần phải chỉ định Boost, vv ... –

+0

Giải pháp tuyệt vời, thậm chí trước tiên tôi cần loại bỏ libmysqlcppconn-dev hiện có và sau đó làm theo những gì bạn đã nói. làm việc gread sau hai ngày nỗ lực! Tôi không biết những gì mysql người đã giữ trên chúng tài liệu .. – Catty

8

Đối với tôi, chỉ cần hoán đổi thứ tự của hai đối số cuối cùng đã khắc phục được sự cố này. Tôi không biết tại sao nhưng mối liên kết có thể tìm thấy hàm get_driver_instance nếu tôi chỉ định tùy chọn -lmysqlcppconn ở cuối tệp nguồn.

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

Cũng lưu ý rằng tôi lấy ra các tùy chọn sau khi tôi nghĩ rằng họ đang dư thừa

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

giải pháp của bạn làm việc cho tôi, cảm ơn rất nhiều! – Purefan

+0

Vâng, điều này cũng làm việc cho tôi, theo nghĩa đen như mô tả di chuyển cờ liên kết đến cuối lệnh mà không xóa bất kỳ cờ bổ sung nào - Có ai hiểu không? – Brizee

1

Nếu tất cả các đường dẫn được bao gồm ném param -I. Bạn sẽ xem liệu có là một vấn đề nếu bạn biên dịch như thế này:

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 

vấn đề sẽ xuất hiện:

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 

Bây giờ bạn phải điều chỉnh thứ tự của -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 

Đó là tất cả !! Lý do rất đơn giản. Bạn có thể tìm hiểu bằng cách sử dụng web hoặc yêu cầu tôi xây dựng.

+0

Tôi đang bối rối về hai vấn đề. 1) tại sao điều này làm cho một sự khác biệt và 2) làm thế nào tôi phải xác định rằng nó đến SAU "của tôi main.o" bằng cách sử dụng autotools/automake? – Discordanian

4

Trong trường hợp bạn là hay quên như tôi và không liên kết thư viện trong CMakeLists.txt:

target_link_libraries(<target> mysqlcppconn) 
+1

Xin chào, '' nghĩa là gì? Tôi cũng đang sử dụng CMakeLists.txt và câu trả lời của bạn là câu trả lời có thể giúp tôi tiết kiệm nhất. –

+0

Mục tiêu là tên bạn đã sử dụng sau khi add_executable (myproj). Trong trường hợp này là 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

Các vấn đề liên quan