2010-12-31 34 views
9

Tôi đang cố gắng để thực hiện soci trong chương trình của tôi nhưng tôi không biết làm thế nào. Tôi đang sử dụng C++ trên Linux, trên một dự án sử dụng netbeans. Tôi đã làm theo các bước trong: http://soci.sourceforge.net/doc/structure.html để cài đặt nó, và tôi đã cố gắng sao chép các tập tin soci.h từ/src/core và soci-mysql.h từ/src/backends/mysql trong dự án của tôi nhưng nó đưa ra một lỗi biên dịch (các tệp này bao gồm các tệp soci khác, nhưng không hợp lệ để sao chép tất cả các tệp vào thư mục ...). Tôi đã đọc hướng dẫn một thời gian nhưng tôi không hiểu những gì tôi đang làm sai. Các ví dụ chỉ bao gồm các tệp này.Làm thế nào để sử dụng thư viện cơ sở dữ liệu SOCI C++?

Cảm ơn.

Chỉnh sửa: Tôi đã cung cấp thêm thông tin trong nhận xét bên dưới câu trả lời. Tôi không biết những bước tôi phải làm theo để thực hiện soci.

+0

Bạn có thực sự chạy 'make install' không? Không cần sao chép các tệp tiêu đề vào thư mục của dự án của bạn. – chrisaycock

+1

Tôi đã chạy lệnh đó.Nếu tôi không sao chép các tập tin đó trình biên dịch cho một lỗi nói rằng các tập tin soci.h và soci-mysql.h không được tìm thấy. Tôi chỉ sao chép những điều sau đây bao gồm từ một ví dụ về tài liệu: [code] #include "soci.h" #include "soci-mysql.h" [/ code] nhưng nó không hoạt động, trình biên dịch nói rằng các tệp đó đã không không tồn tại, vì vậy tôi đã cố gắng sao chép chúng từ gói soci. – NeDark

Trả lời

6

Các bit có liên quan trên trang đó là

Khi kịch bản cấu hình được chạy mà không có thông số, phần còn lại của quá trình này sẽ sử dụng /usr/local/include/soci như một điểm đến mặc định cho các tập tin tiêu đề SOCI và /usr/local/lib như một điểm đến mặc định cho tập tin thư viện

Bây giờ/usr/local/include nên được trong mặc định của bạn bao gồm đường dẫn (ví dụ thử một cái gì đó giống như gcc -c -v -x c++ /dev/null -o /dev/null để xem danh sách các cài đặt của bạn sử dụng) và do đó bạn có thể bao gồm những bằng

#include <soci/soci.h> 
#include <soci/soci-mysql.h> 

Sau đó, bạn cần thêm thư viện vào bước liên kết của mình. Có vẻ như bạn sẽ có cả phiên bản tĩnh và được chia sẻ của các thư viện. Bạn cần phải thêm -lsoci_core -lsoci_mysql vào bước liên kết của mình; tuy nhiên, nếu điều đó không hoạt động thì bạn cũng sẽ cần chỉ định/usr/local/lib làm thư mục tìm kiếm tức là -L/usr/local/lib -lsoci_core -lsoci_mysql. (Một lần nữa nó có thể đã có nhưng bạn có thể thấy bằng cách sử dụng gcc -print-search-dirs.) Tuy nhiên, vấn đề sau đó là nếu bạn đang sử dụng phiên bản chia sẻ và/usr/local/lib không có trong đường dẫn tìm kiếm thư viện phân phối của bạn (xem/etc/ld.so.conf và/hoặc /etc/ld.so.conf.d/*) sau đó nó sẽ không thể tìm thấy thư viện được chia sẻ khi chạy. Bạn sẽ cần phải mã hóa cứng trong đường dẫn đến thư viện bằng công tắc liên kết -rpath hoặc thêm/usr/local/lib vào đường dẫn tìm kiếm toàn hệ thống như trước hoặc trong môi trường của bạn (biến LD_LIBRARY_PATH). Tôi không chắc cách tốt nhất để làm điều này là gì - tôi khuyên bạn nên -rpath để tránh sửa đổi hệ thống nói chung, mặc dù nếu bạn đang xây dựng nhiều thư viện vào/usr/local/lib, điều này có thể có ý nghĩa nó.

+0

Thư viện ném ngoại lệ "Không thể tìm thấy thư viện chia sẻ cho backend mysql", thậm chí chỉ định/usr/local/lib làm thư mục tìm kiếm và -rpath, nhưng tôi có thể giải quyết nó sao chép ba tệp .so mysql backend vào thư mục dự án. Cảm ơn! – NeDark

+0

Hmm, tôi có thể có sai sau đó: nó có thể bạn chỉ cần liên kết trong '-lsoci_core' và sau đó nó sẽ dlopen thư viện mysql chính nó? Đó là lẻ nó không thể sau đó tìm thấy các thư viện, mặc dù, vì nó đã có thể biết rằng/usr/local/lib sẽ là nơi để xem xét thời gian xây dựng. Xin lỗi, tôi không biết soci đặc biệt để đề xuất bất cứ điều gì tốt hơn nhưng vui mừng bạn đã nhận nó làm việc! – Rup

+0

Không, tôi vừa thử điều đó và nó không hoạt động nếu không có tùy chọn -lsoci_mysql. Tôi không biết tại sao, nhưng soci cũng attemps để dlopen thư viện phụ trợ mysql. Tôi đã tìm thấy tệp xảy ra khi tìm kiếm lỗi phổ biến trên google: http://code.google.com/p/boost-soci/source/browse/trunk/libs/soci/src/backend-loader.cpp?r= 2 PD: Bạn có thể cho tôi biết cách bạn đặt "thẻ mã" vào các bình luận không? – NeDark

2

tôi đã cùng không tải backend lỗi trên chương trình của tôi C++ khi tôi thực hiện session sql("mysql://db=...)

Tôi tìm thấy một giải pháp (ít nhất là trên Ubuntu 11.04 của tôi). Chỉ cần làm:

sudo -i ln -s /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so /usr/lib/libsoci_mysql.so 

Nó dường như rằng các thư viện SOCI tìm kiếm các tập tin /usr/lib/libsoci_mysql.so mà không có trong hệ thống, mua nếu bạn thực hiện một liên kết đến các thư viện /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so rằng đó là trong hệ thống nó hoạt động (Tôi nghĩ rằng debian/ubuntu làm cho một tên tập tin thay đổi từ tên gốc, nhưng nó có tác dụng phụ bởi vì các thư viện SOCI tìm kiếm bên trong cho tên ban đầu).

Tôi đã tìm thấy lỗi bằng biến môi trường bash LD_DEBUG=files và chạy nhị phân C++ của tôi.

Hy vọng điều đó sẽ hữu ích.

+0

'xuất LD_DEBUG = tệp' rất hữu ích, cảm ơn. –

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