2016-04-11 22 views
0

Bir Win32 penceresini uygulamak zorunda kaldığım bir ödevi bitirdikten sonra, işlevlerimi bir dll'ye vermek istedim. C Dışa aktarılamayan işlevler

Şaşırtıcı bağlayıcı

  • __declspec (dllexport)/__declspec (dllimport) doğru tanımlandığı gibidir ve kullanılan taşıyamazsınız, başvurulmayan bağlantılar şikayet (veya ++ I C için kullanılan gibi).
  • Kitaplık, bağlayıcıya doğru bir şekilde belirtildi.
  • İşlevler bağımlılık yürüteç içinde görünür.

bağlayıcı daima (Almanca olarak) şikayet:

hata LNK2019: aufgel ÷ STES externes Sembol "" __declspec (dllimport) struct cw_Window * __Cdecl createWindow (Char *, imzasız Verweis auf nicht kısa, imzasız kısa) "(__imp_? createWindow @@ YAPEAUcw_Window @@ PEADGG @ Z)" Funktion "başlığında". C: \ Users \ jkirs \ Desktop \ Çalışma Alanı \ Unit.MSVC2015-x86-64.88a6cdd3 \ intermediate.Unit.exe \ MSVC2015_x86_64 salınımlı: önemli hata LNK1120: 1 nicht aufgel ÷ ste Externe

Benim fonksiyonları prototip şu şekilde tanımlanmaktadır:

"API" aşağıdaki gibi tanımlanmıştır
typedef struct cw_Window cw_Window_t; 
typedef struct cw_Event  cw_Event_t; 

API cw_Window_t* createWindow(char* pTitle, uint16_t nWidth, uint16_t nHeight); 
API void   destroyWindow(cw_Window_t* pWindow); 
API void   pollEvent(cw_Window_t* pWindow, cw_Event_t* pEvent); 

:

#ifdef _MSC_VER 
    #ifdef CW_EXPORT 
     #define API __declspec(dllexport) 
    #else 
     #define API __declspec(dllimport) 
    #endif 
#else 
    #define API // TODO 
#endif 

I de API 'tanımı 'extern "C"' eklemek çalıştı, wit Bir sonuç, ancak 'C' dizesi literal hakkında şikayetçi.

Bu konuyla karşılaşan biri oldu ve bana doğru yöne doğru işaret edebilir mi?

Önemli olan: Visual Studio C++ 2015 (MSVC_x86_64); başlık dosyam '.h' ile biter ve kaynak dosyaları '.c' ile biter.

DÜZENLEME: Lib'in C kodunda tekrar kullanılması gerekiyordu.

cevap

0

Sonuçta yaptığım her şey gayet güzeldi, ancak yapı sistemi. Buildsystem, dosyayı düz C yerine C++ Kaynak Dosyası olarak döndürdü.

0

extern "C" ile temel sorunu ve yaklaşık çözümü biliyorsunuz. Ama senin hatan: API tanımında extern "C" yazmayın. onunla bildirim ve tanımlarının sarın:

typedef struct cw_Window cw_Window_t; 
typedef struct cw_Event  cw_Event_t; 

extern "C" { 
API cw_Window_t* createWindow(char* pTitle, uint16_t nWidth, uint16_t nHeight); 
API void   destroyWindow(cw_Window_t* pWindow); 
API void   pollEvent(cw_Window_t* pWindow, cw_Event_t* pEvent); 
} 

Ben extern benziyor ve ne çalışıyorlardı extern koymak için mantıklı bir yer gibi görünüyor, ama extern "C" farklı kurallarla farklı bir canavar olduğunu biliyoruz; Bu konuda istediğinizden daha fazlasını okuyabilirsiniz. In C++ source, what is the effect of extern "C"?

İlgili konular