2015-04-21 12 views
5

// API mathAPI.h, cả trong Dll.cpp và Test.cppC++ Làm thế nào để xuất một thành viên lớp tĩnh từ một dll?

#ifdef __APIBUILD 
#define __API __declspec(dllexport) 
//#error __APIBUILD cannot be defined. 
#else 
#define __API __declspec(dllimport) 
#endif 

class math 
{ 
public: 
    static __API double Pi; 
    static __API double Sum(double x, double y); 
}; 

// Dll.cpp __APIBUILD được định nghĩa

#include "mathAPI.h" 

double math::Pi = 3.14; 

double math::Sum(double x, double y) 
{ 
    return x + y; 
} 

// Test.cpp __APIBUILD không được định nghĩa

#include <iostream> 
#pragma comment(lib, "dll.lib") 
#include "mathAPI.h" 

int main() 
{ 
    std::cout << math::Pi; //linker error 
    std::cout << math::Sum(5.5, 5.5); //works fine 
    return 0; 
} 

lỗi 1 lỗi LNK2001: chưa được giải quyết biểu tượng bên ngoài "công cộng: static double Math :: Pi" (? Pi @ Math @@ 2na)

Làm cách nào để tôi làm việc này?

+0

Có lỗi trong mã của bạn hoặc lỗi trong bài đăng của bạn vì 'Math :: Pi' khác với' math :: Pi' – nos

Trả lời

2

Các giải pháp tốt hơn để có được giá trị Pi của bạn là tạo ra một phương pháp tĩnh để init và gửi lại, như sau trong DLL.cpp của bạn:

#include "mathAPI.h" 

// math::getPi() is declared static in header file 
double math::getPi() 
{ 
    static double const Pi = 3.14; 
    return Pi; 
} 

// math::Sum() is declared static in header file 
double math::Sum(double x, double y) 
{ 
    return x + y; 
} 

Điều này sẽ ngăn cản bạn của Pi giá trị uninitialised, và sẽ làm những gì bạn muốn.

Xin lưu ý rằng cách tốt nhất để khởi tạo tất cả các giá trị/thành viên tĩnh là khởi tạo chúng trong một cuộc gọi hàm/phương thức.

+0

Đây có vẻ là giải pháp làm việc duy nhất ... – Nullptr

0

Thay vì xuất từng thành viên, export whole class. Ngoài ra, tôi hoàn toàn không biết mã này có thể hoạt động như thế nào - bạn không cung cấp định nghĩa cho sum() (thiếu toán tử phạm vi lớp) và đó là điều mà người liên kết nên khiếu nại (thay vì math::Sum(), bạn đã xác định mới, toàn cầu sum()).

mathAPI.h

#ifdef __APIBUILD 
#define __API __declspec(dllexport) 
#else 
#define __API __declspec(dllimport) 
#endif 

class __API math //Add __API to export whole class 
{ 
public: 
    static double Pi; 
    static double Sum(double x, double y); 
}; 

Dll.cpp

#include "mathAPI.h" 

double math::Pi = 3.14; 

double math::Sum(double x, double y) //You missed 'math::' here before 
{ 
    return x + y; 
} 

Và đó là nó.


EDIT

Bạn vẫn nên nhận được một lỗi, mặc dù. Đó là bởi vì bạn đã thực hiện một lỗi đánh máy, mà tôi đã không nhận thấy (và bạn đã không đăng mã thực sự!). Trong Dll.cpp của bạn, bạn đã viết:

double math::Pi = 3.14; 

Mặc dù bạn gửi một cái gì đó khác nhau, tôi chắc chắn, rằng lớp học của bạn được đặt tên Math, không math, vì mối liên kết đang cố gắng tìm kiếm cho:

[email protected]@@2NA 

Vì vậy, nó đang tìm kiếm trong lớp Math. Đây là dự đoán khả thi nhất. Mặc dù, tôi khá chắc chắn rằng bạn không đăng mã thực, nhưng đoạn mã được viết tay.

+1

Lỗi liên kết tương tự, không hoạt động. biểu tượng bên ngoài chưa được giải quyết "công khai: static double Math :: Pi" (?Pi @ Math @@ 2NA) – Nullptr

+0

@Nullptr Có, bạn vẫn nên nhận được lỗi này, tôi đã không nhận thấy một lỗi nữa, xem câu trả lời được cập nhật. –

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