2017-08-01 14 views
5

Tôi đang cố gắng tạo thư viện C++ có một hàm được hiển thị bằng cách sử dụng MinGW.Làm cách nào để xuất các biểu tượng đúng vào một cửa sổ DLL bằng cách sử dụng MinGW?

Tôi nghĩ rằng tôi đã đọc đủ tutorials, nhìn xung quanh internet, nhưng không có gì có vẻ hoạt động, lỗi luôn giống nhau. Tham chiếu không xác định đối với hàm.

Đây là tiêu đề của thư viện (findPoints.h):

#ifndef FIND_POINTS_H 
#define FIND_POINTS_H 

#ifdef BUILDING_FIND_POINTS_DLL 
#define FIND_POINTS_DLL_PREFIX __declspec(dllexport) 
#else 
#define FIND_POINTS_DLL_PREFIX __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

FIND_POINTS_DLL_PREFIX void findPoints(uint8_t* data, int height, int width, int* cx, int* cy, int* lx, int* ly, int* rx, int* ry, int* quality); 

#ifdef __cplusplus 
} 
#endif 

#endif 

Đây là phần khai báo hàm trong tập tin nguồn của nó (findPoints.h):

#include "findPoints.h" 

//... 

void FIND_POINTS_DLL_PREFIX findPoints(uint8_t* data, int height, int width, int* cx, int* cy, int* lx, int* ly, int* rx, int* ry, int* quality) { 
    std::thread worker(findDroplet, data, height, width, cx, cy, lx, ly, rx, ry, quality); 
    worker.detach(); 
} 

Các tập tin là khoảng 1000 dòng dài (tất cả là một phần của khai báo của findDroplet, chỉ phụ thuộc vào các thư viện chuẩn), vì vậy tôi đã bỏ qua điều đó, lỗi này không xuất hiện ở đó.

Để xác minh chính xác, tôi đưa nó vào tệp main.cpp. Mặc dù nó biên dịch khi tôi sử dụng:

gcc main.cpp findPoints.cpp -o findPoints.exe 

Tôi không thể tạo một dll có thể sử dụng được (tôi cần một dll). Đây là những gì tôi làm:

g++ -c -O3 -DBUILDING_FIND_POINTS_DLL findPoints.cpp 
g++ -c main.cpp 
g++ -shared -o findPoints.dll -Wl,--out-implib,libfindPoints.a 
g++ -o findPoints.exe main.o -L. -lfindPoints 

Nó vẫn thất bại với thông báo lỗi:

main.o:main.cpp:(.text+0x1d5): undefined reference to `_imp__findPoints' 

Tôi đã thử tất cả các kiểu hoán vị các tiền tố, nhưng không có vẻ làm việc. Luôn luôn không tìm thấy findPoins, tùy thuộc vào tiền tố nó có thể có một số tiền tố hoặc hậu tố, nhưng nó không bao giờ có. Tôi đã thử dlltool, nhưng nó không bao giờ liệt kê chức năng đó.

Dường như chức năng findPoints từ tệp cpp bị bỏ qua hoàn toàn, thông báo lỗi vẫn giữ nguyên nếu tôi đổi tên. Họ có cùng chữ ký bởi vì nếu không thì việc biên dịch chúng lại với nhau sẽ không hiệu quả.

EDIT: Nghiên cứu thêm: Tôi đã quản lý để tạo một thư viện dll và một chương trình exe sử dụng nó bằng Visual Studio. Nó hoạt động (và treo nếu dll vắng mặt). Nhưng nếu tôi cố gắng sử dụng MingGW để biên dịch chương trình và liên kết dll với nó, lỗi vẫn giữ nguyên. Vấn đề được giải quyết ngay bây giờ, nhưng với chi phí của một cách giải quyết nặng nề. Tuy nhiên, tôi muốn biết câu trả lời vì tôi không thích Visual Studio.

Trả lời

1

Khi bạn tạo DLL bạn không chuyển bất kỳ đối tượng nào đến g++.

Thay

g++ -shared -o findPoints.dll -Wl,--out-implib,libfindPoints.a 

với

g++ -shared -o findPoints.dll findPoints.o -Wl,--out-implib,libfindPoints.a 

trong xây dựng chuỗi của bạn.

+0

Cảm ơn bạn đã trả lời, nhưng bây giờ khi cố gắng tạo một chương trình được liên kết động, tôi nhận được 'Không có phần phiên bản ký hiệu cho ký hiệu phiên bản' __cxa_finalize @@ GLIBC_2.2.5''. Lưu ý rằng tôi đã phải thêm '-fPIC' để biên dịch args. – Dugi

+0

Bạn đang cố gắng liên kết một thư viện bổ sung được biên dịch với một phiên bản khác của thư viện GNU C? – t0m

+0

Đó là những gì tôi nghi ngờ. Tôi đã xóa tất cả trừ mã nguồn, biên dịch lại nó và lỗi vẫn còn đó.Tôi đã thay đổi một vài thứ kể cả phiên bản glibc kể từ khi đăng câu hỏi, nhưng tôi không biết làm thế nào nó có thể có hiệu lực sau khi xóa mọi thứ trừ mã nguồn. Verson của tôi glibc s 2,24. – Dugi

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