Hi all, Wow, I recently had the occasion to experiment with building the SG shared library, DLL, in Windows... a NO GO ;=((
Well, with a fresh SG clone, yesterday I think, first I needed to patch the simgear/CMakeLists.txt to get cmake to even start building - patch given below... The two changes are to add the winsock2 library, and since in windows there are two components built, you MUST provide a 'target' for each. In general the .lib goes in the 'lib' directory as usual, but the DLL is a 'runtime' component, thus must go in the 'bin' directory with the executable. But that was just the tip of the iceberg ;=)) While that succeeded in getting the Windows DLL SimGearCore.dll built, NO archive library was generated. And without such a 'library' you can not 'link' to the DLL. It 'exports' nothing, and is quite useless... Now, as the windows people know, there are just two ways to 'export' functions, variables, classes from a windows DLL build - 1. Use __declspec() 2. Use a DEF file 1. Use __declspec() ==================== This declaration has to be added to each and every function, variables, class you want to export. This is usually done with a macro of the form - #ifdef WIN32 #ifdef SG_LIBRARY /* building the library */ #define SG_EXPORT __declspec(dllexport) #else /* link with application */ #define SG_EXPORT __declspec(dllimport) #endif #else /* not in windows */ #define SG_EXPORT extern #endif This could probably go in say compiler.h... Then every function exported needs this declaration, like - SG_EXPORT int foo(); SG_EXPORT class X {} varX; SG_EXPORT ULONG ulDataInDll; Like in say xml/easyxml.hxx, in part... class SG_EXPORT XMLAttributes { public: // ... }; ... SG_EXPORT void readXML (istream &input, ...); SG_EXPORT void readXML (const string &path,...); And so on, and On, and ON ;=)) For each SG header that exports something as part of the SG API... 2. Use a DEF file ================= In this Module-Definition file EVERY function, variable to be exported has to be declared! EXPORTS foo @1 ulDataInDll DATA readXML # and onward for all SG API items Not sure how classes are declared in here... and the assignment of an ordinal value, like @1 to @N, is optional... And then that simgear.def file added to the cmake list file for the windows build. cmake handles it without problems... And that DEF file has to be maintained. Function names removed or added as the API changes... And then another matter noted... 3. SG SO Version ================ At present it seems only one DLL is produced, SimGearCore.dll without a 'version' indication... like say SimGearCore29.dll SimGearCore29.lib In a fast changing API, like SG is, then it is essential that the DLL be version-ed... like I assume it is in unix... And like say the OSG Windows DLLs are, like ... osg92-osg.dll, but just noted they do not add this to the libraries - it is always just osg.lib. But that is ok since which ever osg.lib you link with, will automatically 'force' a version DLL... So likewise maybe one name, SimGearCore.lib would be ok... But this version is important, since if you built say the 2.8 DLL they can NOT be used for 2.9 due to several API changes... And in this case that is ignoring that 2.8 would be 20+ DLLs, versus 2.9 of two... But here I am talking about API changes like - sgGetMagVar(lon, lat, elev, ... to sgGetMagVar(SGGeod, ... which may have happened even before 2.8... did not check the date of this change... And this SO version would needed to be kicked for EACH API change... more maintenance, which I hope IS being done in unix... Conclusion ========== As you can see, this would be *L*O*T*S* of work and FOREVER continued maintenance... although using 1, once developers got into the habit of using SG_EXPORT, then this could be minimized... But maybe we would be better off removing the SIMGEAR_SHARED option if WIN32 ;=)) That is do NOT offer an option that can NOT be used! And of course, I really wonder WHY we added a 'shared' version of SG at all... but that is another topic... I assume someone had a 'good' only-for-UNIX reason ;=)) In general, in Windows, using a DLL is a real PITA! HTH. Regards, Geoff. <patch> diff --git a/simgear/CMakeLists.txt b/simgear/CMakeLists.txt index d505998..9bb8dce 100644 --- a/simgear/CMakeLists.txt +++ b/simgear/CMakeLists.txt @@ -64,7 +64,10 @@ if(SIMGEAR_SHARED) target_link_libraries(SimGearCore ${ZLIB_LIBRARY} ${RT_LIBRARY} ${EXPAT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) - + if (WIN32) + target_link_libraries(SimGearCore ${WINSOCK_LIBRARY}) + endif (WIN32) + if(LIBSVN_FOUND) target_link_libraries(SimGearCore ${LIBSVN_LIBRARIES}) endif(LIBSVN_FOUND) @@ -86,10 +89,19 @@ if(SIMGEAR_SHARED) ${OPENGL_LIBRARY} ${JPEG_LIBRARY}) - install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + if (WIN32) + target_link_libraries(SimGearScene ${WINSOCK_LIBRARY}) + endif (WIN32) + install(TARGETS SimGearScene + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() - install(TARGETS SimGearCore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS SimGearCore + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) else() message(STATUS "Library building mode: STATIC LIBRARIES") </patch> ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_nov _______________________________________________ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel