From: Christopher S. <cl...@se...> - 2003-08-27 07:09:50
|
If a c++ class is declared using __declspec(dllexport/dllimport) and it contains a function that is basically unused, should gcc still create an entry in the import library for that function? A small test case if available at http://www.seawood.org/mingw/class.zip . #ifdef _IMPL_COM #define NS_COM __declspec(dllexport) #else #define NS_COM __declspec(dllimport) #endif class NS_COM cls_Class { public: cls_Class() { mStr = 0; }; cls_Class(const char* in); ~cls_Class(); virtual const char* get() const; void DoNothing() { } protected: virtual int length() const; private: char *mStr; }; Whenever the dll is compiled, cls_Class::DoNothing() does not show up in either the dll or the import library. This happens regardless of whatever optimization level is passed to the compiler. If I make DoNothing() virtual (as get() is), then it shows up. I would have expected it to show up if I added NS_COM to the function declaration but it doesn't. Using -fkeep-inline-functions prevents the function from being dropped but causes other problems for me when building Mozilla. I ran across this problem while trying to getting gcc 3.3.1RC1 to compile Mozilla, http://bugzilla.mozilla.org/show_bug.cgi?id=217009 . When I stopped linking xpcom using -Wl,--export-all-symbols to avoid the auto-import problem, the test programs failed to compile because of some missing symbols from the xpcom import library. Afaict, the classes themselves were properly decorated with NS_COM (though some of their base classes weren't) but the functions still would not show up in the import library. In some cases, adding an explicit NS_COM to the function did help. I'm not completely sure how those test programs are referencing those functions as lxr shows them to be otherwise unused (which is why I figure that gcc is dropping them). Is this normal behavior or just some dllimport/dllexport quirk that I'm unaware of? - cls |