2012-11-18 29 views
5

Tôi đã cố gắng liên kết tĩnh với sqlite3 mà không thành công. Tôi đang sử dụng tiêu đề 'etc.c.sqlite3' và hỗn hợp sqlite3. Để tạo tệp .lib Tôi đã thử cả VC++ và MinGW-gcc, cả hai tệp này đều biên dịch thành công - nhưng cả hai đều tạo ra định dạng đối tượng COFF (optlink, mà DMD sử dụng, làm việc với OMF). Sau khi đọc tấn bài đăng trên 'digitalmars.D', tôi đã thử một số giải pháp khác nhau.Liên kết SQLite tĩnh với DMD (Windows x86)

objconv:

  • cố gắng để chuyển đổi tập tin lib tạo ra với GCC, dẫn đến những biểu tượng không xác định như __divdi3 và __muldi3, đã không thể giải quyết việc này.

  • Cũng cố gắng này để chuyển đổi các tập tin sqlite3.o để * .obj, và sau đó sử dụng 'lib.exe' digitalmars - không thành công cũng

  • Cố objconv trên VC++ lib tạo ra thất bại vì: "SQLite lib là một thư viện nhập khẩu"

implib:

  • Nếu tôi tải về DLL biên dịch sẵn từ sqlite.org và sử dụng implib, nó tạo ra sự tập tin ib, nhưng tên mangling dường như không phù hợp, bởi vì mặc dù tôi liên kết với thư viện tĩnh, tôi vẫn nhận được lỗi sqlite cùng (ví dụ như không xác định biểu tượng _sqlite3_open, _sqlite3_errmsg, _sqlite3_close ...

coffimplib:

  • Nếu tôi sử dụng coffimplib trên tệp thư viện được tạo VC++, chương trình sẽ tạo một tệp gần hết (~ 2KB) chỉ chứa rác (không có ký hiệu nào và hầu hết chỉ là giá trị 'null').

  • Nếu tôi làm như vậy với thư viện được tạo GCC, coffimplib than phiền về "không phải thư viện nhập" và không tạo tệp thư viện được chuyển đổi.

Nếu tôi sử dụng DMC để biên dịch hợp nhất sqlite3, biên soạn thất bại phàn nàn về tấn lỗi. Vì vậy, ở đây tôi, bị mắc kẹt trong hư không, không ai có bất cứ ý tưởng hoặc lời khuyên những gì có thể giải quyết này?

LƯU Ý: Tôi không muốn sử dụng DLL, nhưng liên kết tĩnh với sqlite (đối với các mối quan tâm kích thước thực thi).

+0

gì sai sót nào bạn nhận được với trình biên dịch C? –

+0

Tấn và tấn. Nó sẽ đòi hỏi cách quá nhiều để sửa chữa tất cả, với tất cả các loại lỗi (ví dụ như diễn viên bất hợp pháp, định danh không xác định) –

+0

Tôi đã tải xuống và dùng thử DMC; nó xuất hiện các lỗi được gây ra bởi lỗi trong các tập tin tiêu đề Windows vận chuyển với DMC. –

Trả lời

3

Thử sử dụng implib bằng công tắc /system.

+0

Điều đó thực sự đã thực hiện thủ thuật! Mặc dù điều này tạo ra một thư viện nhập khẩu, không phải là một thư viện tĩnh, do đó, thực thi vẫn còn phụ thuộc vào toàn bộ sqlite dll khi nó chỉ sử dụng ~ 5 chức năng của nó –

0

Tại sao bạn không biên dịch và liên kết mã C SQLite với ứng dụng D của mình? Tôi đoán rằng sẽ tiết kiệm của bạn từ đau đầu liên quan đến thư viện.

Tất nhiên một lựa chọn tốt là để biên dịch các thư viện tĩnh SQLite với DMC, và sử dụng nó với dự án D bằng cách đơn giản thực hiện: dmd -of myproggy myproggy.d somefile.d libsqlite.lib

+0

Dmc không biên dịch (xem bình luận của tôi) sự kết hợp SQLite. Và nếu tôi muốn liên kết, các đối tượng cần phải ở định dạng OMF, và đó là gốc rễ của vấn đề của tôi! –

1

Trên Windows bạn đang tốt hơn off với dlls. Giúp bạn tiết kiệm rất nhiều đau đầu.

Làm việc trên hỗ trợ x64 đang được triển khai sẽ thúc đẩy liên kết của COFF + VC mà tôi nghĩ. Điều này hy vọng sẽ thay đổi tình huống khó xử.

Edit: Nếu bạn thực sự cần libs tĩnh bạn có thể thử ra Unilink, có khả năng liên kết OMF và COFF tập tin với nhau: ftp://ftp.styx.cabel.net/pub/UniLink

+0

Vâng, đó là những gì tôi đang sử dụng tại thời điểm này, nhưng không phải tất cả thư viện đều hỗ trợ chia sẻ (ví dụ dyncall) và kích thước ứng dụng nhảy khi sản xuất các tệp thực thi nhỏ (so với phụ thuộc) –

+0

cập nhật bài đăng của tôi – Trass3r

+0

Unilink chắc chắn là một lựa chọn thú vị ! Tôi sẽ kiểm tra nó (tài liệu nông mặc dù). Bạn có bất kỳ ý tưởng nào khi hỗ trợ x64 cho COFF không? –

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