2011-03-17 15 views
10

ben visual studio 10 kullanılarak gdcm oluştururken düzeltmeye çalışıyorum uyarıların bir dizi (32 bit sürümü) var:Bu vs10 tutarsız dll bağlantı uyarısını nasıl düzeltebilirim?

4>..\..\..\..\gdcm\Utilities\gdcmexpat\lib\xmlparse.c(647): warning C4273: 'XML_ParserCreate' : inconsistent dll linkage 
4>   d:\src\gdcm\gdcm\utilities\gdcmexpat\lib\expat.h(206) : see previous definition of 'XML_ParserCreate' 

işlevi kendisini aramak gibi görünüyor:

XML_Parser XMLCALL 
XML_ParserCreate(const XML_Char *encodingName) 
{ 
    return XML_ParserCreate_MM(encodingName, NULL, NULL); 
} 

nerede

#define XMLCALL __cdecl 

ve

XMLPARSEAPI(XML_Parser) 
XML_ParserCreate(const XML_Char *encoding); 

nerede

#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL 

ve

#define XMLIMPORT __declspec(dllimport) 

Ben bağlantı sürekli XMLCALL-- sağ aracılığıyla __cdecl demektir ki düzgün olduğunu okuyorsam? Çünkü eğer öyleyse, o zaman uyarı gereksizdir, yoksa bunu yanlış yorumlu muyum?

cevap

16

Hayır, işlev tanımında eksik olan ancak işlev bildirimi üzerinde bulunan __declspec(dllimport) hakkında şikayetçi. Bunu ciddiye almalısınız, bir DLL'den aktarılan işlevi bildirmek mantıklı değil, aynı zamanda kodunuzda bulunan da. Her ikisine de sahip olamazsın. Bu, genellikle eksik #define nedeniyle oluşur. Makro tanımlarını düzenlediniz, bence ama DLL'yi oluştururken, genellikle derleme komutunda (/ D) bir makro belirtin. Böylece, işlevin bildirimi dllimport yerine dllexport kullanır. Hangi işlevin DLL'den alınmasını sağlar. İstemci kodu aynı .h dosyasını kullanır ancak bu makro tanımlanmamış olarak oluşturulur. Dllimport olarak bildirilen işlevi görür.

XMLIMPORT makro tanımına daha yakından bakın, __declspec(dllexport) yakın olmalıdır. Başka bir tanılama, Dumpbin.exe/export ile görülebilen dışa aktarılmış işlevler kümesidir. Doğru tahmin edersem eksik olmalılar.

+0

Öyleydi-- bu dllimport bir dllexport olmalıydı. – mmr

+0

Vay canına, ihraç edilen bir değişkeni de kaçırdım. Üstbilgisinde COMMON_API extern const std :: string someStr gibi bir şey vardı; cpp dosyasında std :: string someStr ("Background") vardı; bu da export/import specifier eksikti. API makrosu, ekiplerin, projenin bir dll yapması ya da olmamasını belirten bir makroya sahip olup olmadığına bağlı olarak değişir. Buna bir göz atmam gerekecek. – jxramos