EPICS Home

Experimental Physics and Industrial Control System


 
1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  <20152016  2017  2018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  <20152016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: EPICS V4 on Windows
From: <[email protected]>
To: <[email protected]>
Date: Mon, 12 Jan 2015 12:08:42 +0000
Hi,

I downloaded and compiled EPICS v4.4.0 on Windows (Visual Studio 2010/Windows 7/base 3-14-12-4) and exampleCPP/HelloWorld ran OK when compiled Release, but I recall having a crash when running in Debug mode. I say "recall" as I've subsequently gone back and now can't reproduce my original problem! However it set me on the path of removing some of the C4275 (non-dll-interface used as basis for dll-interface) and LNK4217 (locally defined symbol imported) warnings output during the debug build. I enclose the changes I made as, though not necessary for building with the Microsoft Compiler, they allow the code to be compiled under both MinGW and Cygwin too. 

The MinGW build has a couple of small issues remaining. During compile there are various warning about "%z" or "%lli" not being supported in printf/sprintf, and pvaSvr.dll fails to link with:

    dbUtil.o:dbUtil.cpp:(.text+0x1147): undefined reference to `_imp__epicsAlarmConditionStrings'

dbPv/caMonitor.cpp includes <alarmString.h> and dbPv/dbUtil.cpp includes <alarm.h>  -  a quick workaround to allow building is to change the "epicsShareExtern" to just "extern" in <epics base>/alarm.h  so during linking the global instance defined in dbPv/caMonitor.cpp via <alarmString.h> is matched. I'm guessing by the presence of epicsShareExtern in <alarm.h> clients should be getting these strings from <epics base> itself, but I couldn't see them exported anywhere by base?

Regards,

Freddie
Index: pvaSrv/testTop/dbPv/src/Makefile
===================================================================
--- pvaSrv/testTop/dbPv/src/Makefile	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvaSrv/testTop/dbPv/src/Makefile	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -31,7 +31,7 @@
 testDbPvSupport_SRCS += bigstringinRecord.c
 testDbPvSupport_SRCS += waitRecord.c
 testDbPvSupport_SRCS += testDbPv.cpp
-testDbPvSupport_LIBS_WIN32 += pvAccess pvData dbIoc Com
+testDbPvSupport_LIBS += pvAccess pvData dbIoc Com
 
 #=============================
 # Build an IOC application
Index: pvaSrv/src/dbPv/dbPvProvider.cpp
===================================================================
--- pvaSrv/src/dbPv/dbPvProvider.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvaSrv/src/dbPv/dbPvProvider.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -26,6 +26,7 @@
 #include <pv/noDefaultMethods.h>
 #include <pv/lock.h>
 
+#define epicsExportSharedSymbols
 #include "dbPv.h"
 #include "caSecurity.h"
 
Index: pvDataCPP/src/pv/pvData.h
===================================================================
--- pvDataCPP/src/pv/pvData.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDataCPP/src/pv/pvData.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -10,7 +10,7 @@
 #ifndef PVDATA_H
 #define PVDATA_H
 
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(_MINGW)
 #define NOMINMAX
 #endif
 
@@ -410,6 +410,24 @@
     friend class PVDataCreate;
 };
 
+    template<>
+    inline std::ostream& PVScalarValue<int8>::dumpValue(std::ostream& o) const
+    {
+        return o << static_cast<int>(get());
+    }
+
+    template<>
+    inline std::ostream& PVScalarValue<uint8>::dumpValue(std::ostream& o) const
+    {
+    	return o << static_cast<unsigned int>(get());
+    }
+
+    template<>
+    inline std::ostream& PVScalarValue<boolean>::dumpValue(std::ostream& o) const
+    {
+        return o << std::boolalpha << static_cast<bool>(get());
+    }
+
 /**
  * typedefs for the various possible scalar types.
  */
Index: pvDataCPP/src/pv/pvType.h
===================================================================
--- pvDataCPP/src/pv/pvType.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDataCPP/src/pv/pvType.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -15,7 +15,7 @@
 #ifndef PVTYPE_H
 #define PVTYPE_H
 
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(_MINGW)
 #define NOMINMAX
 #pragma warning(disable: 4251)
 #endif
Index: pvDataCPP/src/factory/PVScalar.cpp
===================================================================
--- pvDataCPP/src/factory/PVScalar.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDataCPP/src/factory/PVScalar.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -30,21 +30,4 @@
        return static_pointer_cast<const Scalar>(PVField::getField());
     }
 
-    template<>
-    std::ostream& PVScalarValue<int8>::dumpValue(std::ostream& o) const
-    {
-        return o << static_cast<int>(get());
-    }
-
-    template<>
-    std::ostream& PVScalarValue<uint8>::dumpValue(std::ostream& o) const
-    {
-    	return o << static_cast<unsigned int>(get());
-    }
-
-    template<>
-    std::ostream& PVScalarValue<boolean>::dumpValue(std::ostream& o) const
-    {
-        return o << std::boolalpha << static_cast<bool>(get());
-    }
 }}
Index: pvDataCPP/src/misc/parseToPOD.cpp
===================================================================
--- pvDataCPP/src/misc/parseToPOD.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDataCPP/src/misc/parseToPOD.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -249,9 +249,9 @@
 }
 #endif
 
-// MS Visual Studio 2013 defines strtoll, etc.
+// MS Visual Studio 2013 and MinGW define strtoll, etc.
 #if defined(_WIN32)
-#  if (_MSC_VER >= 1800)
+#  if (_MSC_VER >= 1800) || defined(_MINGW)
 #    define WIN_NEEDS_OLL_FUNC 0
 #  else
 #    define WIN_NEEDS_OLL_FUNC 1
Index: pvDataCPP/src/misc/sharedVector.h
===================================================================
--- pvDataCPP/src/misc/sharedVector.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDataCPP/src/misc/sharedVector.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -7,7 +7,7 @@
 #ifndef SHAREDVECTOR_H
 #define SHAREDVECTOR_H
 
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(_MINGW)
 #define NOMINMAX
 #endif
 
Index: pvDataCPP/src/misc/epicsException.h
===================================================================
--- pvDataCPP/src/misc/epicsException.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDataCPP/src/misc/epicsException.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -34,7 +34,7 @@
 #ifndef EPICSEXCEPTION_H_
 #define EPICSEXCEPTION_H_
 
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(_MINGW)
 #pragma warning( push )
 #pragma warning(disable: 4275) // warning C4275: non dll-interface class used as base for dll-interface class (std::logic_error)
 #endif
@@ -58,7 +58,7 @@
 #  include <execinfo.h>
 #  include <cxxabi.h>
 #  define EXCEPT_USE_BACKTRACE
-#elif defined(_WIN32) && !defined(__MINGW__) && !defined(SKIP_DBGHELP)
+#elif defined(_WIN32) && !defined(_MINGW) && !defined(SKIP_DBGHELP)
 #  define _WINSOCKAPI_
 #  include <windows.h>
 #  include <dbghelp.h>
@@ -215,7 +215,7 @@
     mutable std::string base_msg;
 };
 
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(_MINGW)
 #pragma warning( pop )
 #endif
 
Index: pvAccessCPP/src/utils/introspectionRegistry.cpp
===================================================================
--- pvAccessCPP/src/utils/introspectionRegistry.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/utils/introspectionRegistry.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,6 +4,7 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#define epicsExportSharedSymbols
 #include <pv/introspectionRegistry.h>
 #include <pv/convert.h>
 #include <pv/serializationHelper.h>
Index: pvAccessCPP/src/utils/introspectionRegistry.h
===================================================================
--- pvAccessCPP/src/utils/introspectionRegistry.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/utils/introspectionRegistry.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -29,6 +29,8 @@
 #	undef introspectionRegistryEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 // TODO check for memory leaks
 
 namespace epics {
Index: pvAccessCPP/src/ca/caChannel.cpp
===================================================================
--- pvAccessCPP/src/ca/caChannel.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/ca/caChannel.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -5,10 +5,10 @@
  */
 
 #include <epicsVersion.h>
+#include <pv/standardField.h>
 
+#define epicsExportSharedSymbols
 #include <pv/logger.h>
-#include <pv/standardField.h>
-
 #include <pv/caChannel.h>
 
 using namespace epics::pvData;
Index: pvAccessCPP/src/ca/caProvider.cpp
===================================================================
--- pvAccessCPP/src/ca/caProvider.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/ca/caProvider.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -10,10 +10,10 @@
 #include <cadef.h>
 #include <epicsSignal.h>
 
-#include <pv/logger.h>
 
 #define epicsExportSharedSymbols
 
+#include <pv/logger.h>
 #include <pv/caProvider.h>
 #include <pv/caChannel.h>
 
Index: pvAccessCPP/src/rpcService/rpcServer.h
===================================================================
--- pvAccessCPP/src/rpcService/rpcServer.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/rpcService/rpcServer.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -19,11 +19,12 @@
 #	undef rpcServerEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/pvAccess.h>
 #include <pv/rpcService.h>
 #include <pv/serverContext.h>
 
-#include <shareLib.h>
 
 namespace epics { namespace pvAccess { 
 
Index: pvAccessCPP/src/pva/clientFactory.cpp
===================================================================
--- pvAccessCPP/src/pva/clientFactory.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/pva/clientFactory.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -5,11 +5,11 @@
  */
  
 #include <pv/lock.h>
-#include <pv/logger.h>
 
 #include <epicsSignal.h>
 
 #define epicsExportSharedSymbols
+#include <pv/logger.h>
 #include <pv/clientFactory.h>
 #include <pv/clientContextImpl.h>
 
Index: pvAccessCPP/src/server/baseChannelRequester.h
===================================================================
--- pvAccessCPP/src/server/baseChannelRequester.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/server/baseChannelRequester.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -20,6 +20,8 @@
 #	undef baseChannelRequesterEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/serverContext.h>
 #include <pv/serverChannelImpl.h>
 
Index: pvAccessCPP/src/server/responseHandlers.cpp
===================================================================
--- pvAccessCPP/src/server/responseHandlers.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/server/responseHandlers.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -17,6 +17,11 @@
 #include <time.h>
 #include <stdlib.h>
 
+#include <osiSock.h>
+#include <osiProcess.h>
+
+#define epicsExportSharedSymbols
+
 #include <pv/responseHandlers.h>
 #include <pv/remote.h>
 #include <pv/hexDump.h>
@@ -25,8 +30,6 @@
 
 #include <pv/byteBuffer.h>
 
-#include <osiSock.h>
-#include <osiProcess.h>
 #include <pv/logger.h>
 
 #include <pv/pvAccessMB.h>
Index: pvAccessCPP/src/server/beaconEmitter.cpp
===================================================================
--- pvAccessCPP/src/server/beaconEmitter.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/server/beaconEmitter.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -8,12 +8,13 @@
 #define NOMINMAX
 #endif
 
+#include <algorithm>
+
+#define epicsExportSharedSymbols
+
 #include <pv/beaconEmitter.h>
 #include <pv/serializationHelper.h>
-
 #include <pv/logger.h>
-#include <algorithm>
-
 #include <pv/serverContext.h>
 
 using namespace std;
Index: pvAccessCPP/src/server/baseChannelRequester.cpp
===================================================================
--- pvAccessCPP/src/server/baseChannelRequester.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/server/baseChannelRequester.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,6 +4,8 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#define epicsExportSharedSymbols
+
 #include <pv/baseChannelRequester.h>
 
 using namespace epics::pvData;
Index: pvAccessCPP/src/server/responseHandlers.h
===================================================================
--- pvAccessCPP/src/server/responseHandlers.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/server/responseHandlers.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -19,6 +19,8 @@
 #	undef responseHandlersEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/serverContext.h>
 #include <pv/remote.h>
 #include <pv/serverChannelImpl.h>
Index: pvAccessCPP/src/remoteClient/clientContextImpl.h
===================================================================
--- pvAccessCPP/src/remoteClient/clientContextImpl.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remoteClient/clientContextImpl.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -19,12 +19,13 @@
 #	undef clientContextImplEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/pvAccess.h>
 #include <pv/remote.h>
 #include <pv/channelSearchManager.h>
 #include <pv/inetAddressUtil.h>
 
-#include <shareLib.h>
 
 class ChannelSearchManager;
 
Index: pvAccessCPP/src/remoteClient/clientContextImpl.cpp
===================================================================
--- pvAccessCPP/src/remoteClient/clientContextImpl.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remoteClient/clientContextImpl.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -13,22 +13,23 @@
 #include <pv/lock.h>
 #include <pv/timer.h>
 #include <pv/bitSetUtil.h>
-#include <pv/serializationHelper.h>
 #include <pv/convert.h>
 #include <pv/queue.h>
 #include <pv/standardPVField.h>
 
+#define epicsExportSharedSymbols
+
 #include <pv/pvAccess.h>
 #include <pv/pvaConstants.h>
 #include <pv/blockingUDP.h>
 #include <pv/blockingTCP.h>
 #include <pv/namedLockPattern.h>
+#include <pv/serializationHelper.h>
 #include <pv/inetAddressUtil.h>
 #include <pv/hexDump.h>
 #include <pv/remote.h>
 #include <pv/channelSearchManager.h>
 #include <pv/simpleChannelSearchManagerImpl.h>
-#include <pv/clientContextImpl.h>
 #include <pv/configuration.h>
 #include <pv/beaconHandler.h>
 #include <pv/logger.h>
@@ -36,6 +37,8 @@
 
 #include <pv/pvAccessMB.h>
 
+#include <pv/clientContextImpl.h>
+
 //#include <tr1/unordered_map>
 
 using std::tr1::dynamic_pointer_cast;
Index: pvAccessCPP/src/remote/blockingTCPConnector.cpp
===================================================================
--- pvAccessCPP/src/remote/blockingTCPConnector.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/blockingTCPConnector.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,6 +4,13 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#include <sys/types.h>
+#include <sstream>
+
+#include <epicsThread.h>
+#include <osiSock.h>
+
+#define epicsExportSharedSymbols
 #include <pv/blockingTCP.h>
 #include <pv/remote.h>
 #include <pv/namedLockPattern.h>
@@ -10,12 +17,7 @@
 #include <pv/logger.h>
 #include <pv/codec.h>
 
-#include <epicsThread.h>
-#include <osiSock.h>
 
-#include <sys/types.h>
-#include <sstream>
-
 using namespace epics::pvData;
 
 namespace epics {
Index: pvAccessCPP/src/remote/blockingUDPConnector.cpp
===================================================================
--- pvAccessCPP/src/remote/blockingUDPConnector.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/blockingUDPConnector.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,14 +4,16 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#include <sys/types.h>
+
+#include <osiSock.h>
+
+#define epicsExportSharedSymbols
 #include <pv/blockingUDP.h>
 #include <pv/remote.h>
 #include <pv/logger.h>
 
-#include <osiSock.h>
 
-#include <sys/types.h>
-
 using namespace std;
 using namespace epics::pvData;
 
Index: pvAccessCPP/src/remote/blockingUDPTransport.cpp
===================================================================
--- pvAccessCPP/src/remote/blockingUDPTransport.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/blockingUDPTransport.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -9,6 +9,7 @@
 #include <Ws2tcpip.h>
 #endif
 
+#define epicsExportSharedSymbols
 #include <pv/blockingUDP.h>
 #include <pv/pvaConstants.h>
 #include <pv/inetAddressUtil.h>
Index: pvAccessCPP/src/remote/blockingTCPAcceptor.cpp
===================================================================
--- pvAccessCPP/src/remote/blockingTCPAcceptor.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/blockingTCPAcceptor.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,6 +4,12 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#include <sstream>
+
+#include <osiSock.h>
+#include <epicsThread.h>
+
+#define epicsExportSharedSymbols
 #include <pv/blockingTCP.h>
 #include "codec.h"
 #include <pv/remote.h>
@@ -11,11 +17,7 @@
 
 #include <pv/epicsException.h>
 
-#include <osiSock.h>
-#include <epicsThread.h>
 
-#include <sstream>
-
 using std::ostringstream;
 using namespace epics::pvData;
 
Index: pvAccessCPP/src/remote/abstractResponseHandler.cpp
===================================================================
--- pvAccessCPP/src/remote/abstractResponseHandler.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/abstractResponseHandler.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,15 +4,17 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#include <sstream>
+
+#include <osiSock.h>
+
+#define epicsExportSharedSymbols
 #include <pv/remote.h>
 #include <pv/hexDump.h>
 
 #include <pv/byteBuffer.h>
 
-#include <osiSock.h>
 
-#include <sstream>
-
 using std::ostringstream;
 using std::hex;
 
Index: pvAccessCPP/src/remote/codec.h
===================================================================
--- pvAccessCPP/src/remote/codec.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/codec.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,6 +22,14 @@
 #include <epicsTime.h>
 #include <epicsThread.h>
 
+
+#ifdef abstractCodecEpicsExportSharedSymbols
+#   define epicsExportSharedSymbols
+#	undef abstractCodecEpicsExportSharedSymbols
+#endif
+
+#include <shareLib.h>
+
 #include <pv/byteBuffer.h>
 #include <pv/pvType.h>
 #include <pv/lock.h>
@@ -29,10 +37,6 @@
 #include <pv/event.h>
 #include <pv/likely.h>
 
-#ifdef abstractCodecEpicsExportSharedSymbols
-#   define epicsExportSharedSymbols
-#	undef abstractCodecEpicsExportSharedSymbols
-#endif
 
 #include <pv/pvaConstants.h>
 #include <pv/remote.h>
@@ -42,7 +46,6 @@
 #include <pv/namedLockPattern.h>
 #include <pv/inetAddressUtil.h>
 
-#include <shareLib.h>
 
 namespace epics {
   namespace pvAccess {
@@ -420,7 +423,7 @@
     };
 
 
-    class  BlockingTCPTransportCodec :
+    class epicsShareClass BlockingTCPTransportCodec :
       public BlockingSocketAbstractCodec,
       public SecurityPluginControl
     
Index: pvAccessCPP/src/remote/serializationHelper.h
===================================================================
--- pvAccessCPP/src/remote/serializationHelper.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/serializationHelper.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -24,6 +24,8 @@
 #	undef serializationHelperEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/pvaConstants.h>
 #include <pv/pvAccess.h>
 
Index: pvAccessCPP/src/remote/simpleChannelSearchManagerImpl.cpp
===================================================================
--- pvAccessCPP/src/remote/simpleChannelSearchManagerImpl.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/simpleChannelSearchManagerImpl.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -4,16 +4,19 @@
  * in file LICENSE that is included with this distribution.
  */
 
+#include <stdlib.h>
+#include <time.h>
+#include <vector>
+
+#include <pv/timeStamp.h>
+
+#define epicsExportSharedSymbols
+
 #include <pv/simpleChannelSearchManagerImpl.h>
 #include <pv/pvaConstants.h>
 #include <pv/blockingUDP.h>
 #include <pv/serializeHelper.h>
 
-#include <stdlib.h>
-#include <time.h>
-#include <pv/timeStamp.h>
-#include <vector>
-
 using namespace std;
 using namespace epics::pvData;
 
Index: pvAccessCPP/src/remote/simpleChannelSearchManagerImpl.h
===================================================================
--- pvAccessCPP/src/remote/simpleChannelSearchManagerImpl.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/simpleChannelSearchManagerImpl.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -21,6 +21,8 @@
 #	undef simpleChannelSearchManagerEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/channelSearchManager.h>
 
 namespace epics {
Index: pvAccessCPP/src/remote/transportRegistry.h
===================================================================
--- pvAccessCPP/src/remote/transportRegistry.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/transportRegistry.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -21,8 +21,6 @@
 #include <pv/lock.h>
 #include <pv/pvType.h>
 #include <pv/epicsException.h>
-#include <pv/remote.h>
-#include <pv/inetAddressUtil.h>
 #include <pv/sharedPtr.h>
 
 #ifdef transportRegistryEpicsExportSharedSymbols
@@ -30,6 +28,11 @@
 #	undef transportRegistryEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
+#include <pv/remote.h>
+#include <pv/inetAddressUtil.h>
+
 namespace epics {
 namespace pvAccess {
 
Index: pvAccessCPP/src/remote/remote.h
===================================================================
--- pvAccessCPP/src/remote/remote.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/remote.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -30,6 +30,8 @@
 #	undef remoteEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/pvaConstants.h>
 #include <pv/configuration.h>
 
@@ -125,7 +127,7 @@
         /**
          * Interface defining transport send control.
          */
-        class TransportSendControl : public epics::pvData::SerializableControl {
+        class epicsShareClass TransportSendControl : public epics::pvData::SerializableControl {
         public:
         	POINTER_DEFINITIONS(TransportSendControl);
             
@@ -142,7 +144,7 @@
         /**
          * Interface defining transport sender (instance sending data over transport).
          */
-        class TransportSender : public Lockable {
+        class epicsShareClass TransportSender : public Lockable {
         public:
         	POINTER_DEFINITIONS(TransportSender);
 
@@ -165,7 +167,7 @@
         /**
          * Interface defining transport (connection).
          */
-        class Transport : public epics::pvData::DeserializableControl {
+        class epicsShareClass Transport : public epics::pvData::DeserializableControl {
         public:
         	POINTER_DEFINITIONS(Transport);
 
@@ -314,7 +316,7 @@
         /**
          * Not public IF, used by Transports, etc.
          */
-        class Context {
+        class epicsShareClass Context {
         public:
         	POINTER_DEFINITIONS(Context);
 
@@ -483,7 +485,7 @@
         /**
          * Interface defining a transport that hosts server channels.
          */
-        class ChannelHostingTransport {
+        class epicsShareClass ChannelHostingTransport {
         public:
         	POINTER_DEFINITIONS(ChannelHostingTransport);
 
Index: pvAccessCPP/src/remote/blockingTCP.h
===================================================================
--- pvAccessCPP/src/remote/blockingTCP.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/blockingTCP.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -33,6 +33,8 @@
 #	undef blockingTCPEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/pvaConstants.h>
 #include <pv/remote.h>
 #include <pv/transportRegistry.h>
@@ -97,7 +99,7 @@
 
         };
 
-        class ResponseHandlerFactory
+        class epicsShareClass ResponseHandlerFactory
         {
             public:
         	POINTER_DEFINITIONS(ResponseHandlerFactory);
Index: pvAccessCPP/src/remote/blockingUDP.h
===================================================================
--- pvAccessCPP/src/remote/blockingUDP.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvAccessCPP/src/remote/blockingUDP.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -28,6 +28,8 @@
 #	undef blockingUDPEpicsExportSharedSymbols
 #endif
 
+#include <shareLib.h>
+
 #include <pv/remote.h>
 #include <pv/pvaConstants.h>
 #include <pv/inetAddressUtil.h>
Index: pvDatabaseCPP/test/src/testPVCopy.cpp
===================================================================
--- pvDatabaseCPP/test/src/testPVCopy.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/test/src/testPVCopy.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -25,6 +25,8 @@
 
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
+
+#define epicsExportSharedSymbols
 #include <pv/channelProviderLocal.h>
 #include "powerSupply.h"
 
Index: pvDatabaseCPP/test/src/testPVRecord.cpp
===================================================================
--- pvDatabaseCPP/test/src/testPVRecord.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/test/src/testPVRecord.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -27,6 +27,9 @@
 #include <pv/standardPVField.h>
 #include <pv/pvData.h>
 #include <pv/pvCopy.h>
+
+#define epicsExportSharedSymbols
+
 #include "powerSupply.h"
 
 
Index: pvDatabaseCPP/test/src/testExampleRecord.cpp
===================================================================
--- pvDatabaseCPP/test/src/testExampleRecord.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/test/src/testExampleRecord.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -27,10 +27,11 @@
 #include <pv/standardPVField.h>
 #include <pv/pvData.h>
 #include <pv/pvAccess.h>
-#include "powerSupply.h"
 
 #include <epicsExport.h>
 
+#include "powerSupply.h"
+
 using namespace std;
 using std::tr1::static_pointer_cast;
 using namespace epics::pvData;
Index: pvDatabaseCPP/test/src/powerSupply.h
===================================================================
--- pvDatabaseCPP/test/src/powerSupply.h	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/test/src/powerSupply.h	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -21,7 +21,6 @@
 #include <pv/alarm.h>
 #include <pv/pvTimeStamp.h>
 #include <pv/pvAlarm.h>
-#include <pv/pvDatabase.h>
 
 #ifdef powerSupplyEpicsExportSharedSymbols
 #   define epicsExportSharedSymbols
@@ -30,6 +29,7 @@
 
 #include <shareLib.h>
 
+#include <pv/pvDatabase.h>
 
 namespace epics { namespace pvDatabase { 
 
Index: pvDatabaseCPP/exampleDatabase/src/exampleDatabase.cpp
===================================================================
--- pvDatabaseCPP/exampleDatabase/src/exampleDatabase.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/exampleDatabase/src/exampleDatabase.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,6 +22,9 @@
 
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
+
+#define epicsExportSharedSymbols
+
 #include <pv/channelProviderLocal.h>
 #include <pv/recordList.h>
 #include <pv/traceRecord.h>
@@ -28,7 +31,6 @@
 
 #include <pv/powerSupply.h>
 
-#define epicsExportSharedSymbols
 #include <pv/exampleDatabase.h>
 
 using namespace std;
Index: pvDatabaseCPP/exampleDatabase/src/exampleDatabaseMain.cpp
===================================================================
--- pvDatabaseCPP/exampleDatabase/src/exampleDatabaseMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/exampleDatabase/src/exampleDatabaseMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -19,9 +19,11 @@
 #include <vector>
 #include <iostream>
 
-#include <pv/channelProviderLocal.h>
 #include <pv/serverContext.h>
 
+#include <epicsExport.h>
+
+#include <pv/channelProviderLocal.h>
 #include <pv/exampleDatabase.h>
 #include <pv/exampleMonitorPlugin.h>
 
Index: pvDatabaseCPP/exampleServer/src/exampleServerMain.cpp
===================================================================
--- pvDatabaseCPP/exampleServer/src/exampleServerMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/exampleServer/src/exampleServerMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -21,10 +21,12 @@
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
 #include <pv/exampleServer.h>
+#include <pv/serverContext.h>
+
+#include <epicsExport.h>
 #include <pv/traceRecord.h>
 #include <pv/recordList.h>
 #include <pv/channelProviderLocal.h>
-#include <pv/serverContext.h>
 
 using namespace std;
 using std::tr1::static_pointer_cast;
Index: pvDatabaseCPP/examplePowerSupply/src/Makefile
===================================================================
--- pvDatabaseCPP/examplePowerSupply/src/Makefile	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/examplePowerSupply/src/Makefile	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -13,11 +13,11 @@
 PROD_HOST += powerSupplyMain
 powerSupplyMain_SRCS += powerSupplyMain.cpp
 
+powerSupplyMain_LIBS += powerSupply
 powerSupplyMain_LIBS += pvDatabase
 powerSupplyMain_LIBS += pvAccess
 powerSupplyMain_LIBS += pvData
 powerSupplyMain_LIBS += Com
-powerSupplyMain_LIBS += powerSupply
 
 #===========================
 
Index: pvDatabaseCPP/examplePowerSupply/src/powerSupplyMain.cpp
===================================================================
--- pvDatabaseCPP/examplePowerSupply/src/powerSupplyMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/examplePowerSupply/src/powerSupplyMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -21,10 +21,13 @@
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
 #include <pv/recordList.h>
+#include <pv/serverContext.h>
+
+#include <epicsExport.h>
+
 #include <pv/powerSupply.h>
 #include <pv/traceRecord.h>
 #include <pv/channelProviderLocal.h>
-#include <pv/serverContext.h>
 
 using namespace std;
 using std::tr1::static_pointer_cast;
Index: pvDatabaseCPP/src/pvAccess/registerChannelProviderLocal.cpp
===================================================================
--- pvDatabaseCPP/src/pvAccess/registerChannelProviderLocal.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/src/pvAccess/registerChannelProviderLocal.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -44,7 +44,7 @@
 static const iocshFuncDef pvdblFuncDef = {
     "pvdbl", 0, 0
 };
-extern "C" void epicsShareAPI pvdbl(const iocshArgBuf *args)
+extern "C" void pvdbl(const iocshArgBuf *args)
 {
     PVDatabasePtr master = PVDatabase::getMaster();
     PVStringArrayPtr pvNames = master->getRecordNames();
Index: pvDatabaseCPP/arrayPerformance/src/arrayPerformanceMain.cpp
===================================================================
--- pvDatabaseCPP/arrayPerformance/src/arrayPerformanceMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/arrayPerformance/src/arrayPerformanceMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,11 +22,13 @@
 
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
-#include <pv/traceRecord.h>
-#include <pv/channelProviderLocal.h>
 #include <pv/serverContext.h>
 #include <pv/clientFactory.h>
 
+#include <epicsExport.h>
+
+#include <pv/traceRecord.h>
+#include <pv/channelProviderLocal.h>
 #include <arrayPerformance.h>
 #include <longArrayMonitor.h>
 
Index: pvDatabaseCPP/arrayPerformance/src/longArrayMonitorMain.cpp
===================================================================
--- pvDatabaseCPP/arrayPerformance/src/longArrayMonitorMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/arrayPerformance/src/longArrayMonitorMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,11 +22,13 @@
 
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
-#include <pv/traceRecord.h>
-#include <pv/channelProviderLocal.h>
 #include <pv/serverContext.h>
 #include <pv/clientFactory.h>
 
+#include <epicsExport.h>
+
+#include <pv/traceRecord.h>
+#include <pv/channelProviderLocal.h>
 #include <arrayPerformance.h>
 #include <longArrayMonitor.h>
 
Index: pvDatabaseCPP/arrayPerformance/src/Makefile
===================================================================
--- pvDatabaseCPP/arrayPerformance/src/Makefile	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/arrayPerformance/src/Makefile	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -17,28 +17,28 @@
 
 PROD_HOST += arrayPerformanceMain
 arrayPerformanceMain_SRCS += arrayPerformanceMain.cpp
+arrayPerformanceMain_LIBS += pvDatabaseExample
 arrayPerformanceMain_LIBS += pvDatabase pvAccess pvData Com
-arrayPerformanceMain_LIBS += pvDatabaseExample
 
 PROD_HOST += longArrayMonitorMain
 longArrayMonitorMain_SRCS += longArrayMonitorMain.cpp
+longArrayMonitorMain_LIBS += pvDatabaseExample
 longArrayMonitorMain_LIBS += pvDatabase pvAccess pvData Com
-longArrayMonitorMain_LIBS += pvDatabaseExample
 
 PROD_HOST += longArrayGetMain
 longArrayGetMain_SRCS += longArrayGetMain.cpp
+longArrayGetMain_LIBS += pvDatabaseExample
 longArrayGetMain_LIBS += pvDatabase pvAccess pvData Com
-longArrayGetMain_LIBS += pvDatabaseExample
 
 PROD_HOST += longArrayPutMain
 longArrayPutMain_SRCS += longArrayPutMain.cpp
+longArrayPutMain_LIBS += pvDatabaseExample
 longArrayPutMain_LIBS += pvDatabase pvAccess pvData Com
-longArrayPutMain_LIBS += pvDatabaseExample
 
 PROD_HOST += vectorPerformanceMain
 vectorPerformanceMain_SRCS += vectorPerformanceMain.cpp
+vectorPerformanceMain_LIBS += pvDatabaseExample
 vectorPerformanceMain_LIBS += pvDatabase pvAccess pvData Com
-vectorPerformanceMain_LIBS += pvDatabaseExample
 
 
 include $(TOP)/configure/RULES
Index: pvDatabaseCPP/arrayPerformance/src/longArrayPutMain.cpp
===================================================================
--- pvDatabaseCPP/arrayPerformance/src/longArrayPutMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/arrayPerformance/src/longArrayPutMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,11 +22,13 @@
 
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
-#include <pv/traceRecord.h>
-#include <pv/channelProviderLocal.h>
 #include <pv/serverContext.h>
 #include <pv/clientFactory.h>
 
+#include <epicsExport.h>
+
+#include <pv/traceRecord.h>
+#include <pv/channelProviderLocal.h>
 #include <arrayPerformance.h>
 #include <longArrayPut.h>
 
Index: pvDatabaseCPP/arrayPerformance/src/longArrayGetMain.cpp
===================================================================
--- pvDatabaseCPP/arrayPerformance/src/longArrayGetMain.cpp	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ pvDatabaseCPP/arrayPerformance/src/longArrayGetMain.cpp	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,11 +22,13 @@
 
 #include <pv/standardField.h>
 #include <pv/standardPVField.h>
-#include <pv/traceRecord.h>
-#include <pv/channelProviderLocal.h>
 #include <pv/serverContext.h>
 #include <pv/clientFactory.h>
 
+#include <epicsExport.h>
+
+#include <pv/traceRecord.h>
+#include <pv/channelProviderLocal.h>
 #include <arrayPerformance.h>
 #include <longArrayGet.h>
 
Index: exampleCPP/HelloWorld/helloClientRunner
===================================================================
--- exampleCPP/HelloWorld/helloClientRunner	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ exampleCPP/HelloWorld/helloClientRunner	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -31,4 +31,7 @@
 
 TOP=$(dirname $0)
 
+# On Cygwin we need DLL directories in PATH 
+export PATH=$TOP/bin/$EPICS_HOST_ARCH:$TOP/../../pvAccessCPP/bin/$EPICS_HOST_ARCH:$TOP/../../pvDataCPP/bin/$EPICS_HOST_ARCH:$PATH
+
 $TOP/bin/$EPICS_HOST_ARCH/HelloClient ${1:-Dave}
Index: exampleCPP/HelloWorld/helloServerRunner
===================================================================
--- exampleCPP/HelloWorld/helloServerRunner	(.../EPICS-CPP-4.4.0)	(revision 2419)
+++ exampleCPP/HelloWorld/helloServerRunner	(.../EPICS-CPP-4_4_0)	(working copy)
@@ -22,5 +22,7 @@
 
 TOP=$(dirname $0)
 
+# On Cygwin we need DLL directories in PATH 
+export PATH=$TOP/bin/$EPICS_HOST_ARCH:$TOP/../../pvAccessCPP/bin/$EPICS_HOST_ARCH:$TOP/../../pvDataCPP/bin/$EPICS_HOST_ARCH:$PATH
+
 $TOP/bin/$EPICS_HOST_ARCH/HelloService
-
Index: exampleCPP/HelloWorld/helloClientRunner.bat
===================================================================
--- exampleCPP/HelloWorld/helloClientRunner.bat	(.../EPICS-CPP-4.4.0)	(revision 0)
+++ exampleCPP/HelloWorld/helloClientRunner.bat	(.../EPICS-CPP-4_4_0)	(revision 2453)
@@ -0,0 +1,38 @@
+@echo OFF
+REM
+REM Copyright: See the COPYRIGHT that is included with this distribution.
+REM            EPICS exampleCPP is distributed subject to a Software License
+REM            Agreement found in file LICENSE that is included with this
+REM            distribution.
+REM
+REM Abs: helloClientRunner executes the helloWorldClient EV4 client.
+REM
+REM Rem: helloWorldClient is a simple example of an E4C client demonstrating support
+REM      for a client/server environment in EPICS V4. 
+REM
+REM      helloWorldClient passes the argument it was given to the helloServer,
+REM      which constructs and returns a simple greeting. The helloClient receives 
+REM      the greeting, and prints it.
+REM
+REM Usage: Execute helloClientRunner any time while helloServerRunner is running.   
+REM 
+REM         > ./helloClientRunner [optional name, if not supplied, "Dave" is used].  
+REM
+REM         E.g.: 
+REM         bash-3.2$ ./helloClientRunner julie
+REM         Hello julie
+REM 
+REM Ref: 
+REM ----------------------------------------------------------------------------
+REM Auth: 17-Jan-2013, Dave Hickin ([email protected])
+REM
+REM ============================================================================
+
+set TOP=%~dp0
+set PATH=%TOP%bin\%EPICS_HOST_ARCH%;%TOP%..\..\pvAccessCPP\bin\%EPICS_HOST_ARCH%;%TOP%..\..\pvDataCPP\bin\%EPICS_HOST_ARCH%;%PATH%
+if "%1" == "" (
+    set ARG=Dave
+) else (
+    set ARG=%1
+)
+"%TOP%bin\%EPICS_HOST_ARCH%\HelloClient.exe" %ARG%
Index: exampleCPP/HelloWorld/helloServerRunner.bat
===================================================================
--- exampleCPP/HelloWorld/helloServerRunner.bat	(.../EPICS-CPP-4.4.0)	(revision 0)
+++ exampleCPP/HelloWorld/helloServerRunner.bat	(.../EPICS-CPP-4_4_0)	(revision 2453)
@@ -0,0 +1,24 @@
+@echo OFF
+REM
+REM Copyright: See the COPYRIGHT that is included with this distribution.
+REM            EPICS exampleCPP is distributed subject to a Software License
+REM            Agreement found in file LICENSE that is included with this
+REM            distribution.
+REM
+REM Abs: start_server starts the channel archiver service, which can query a
+REM      Channel Archiver index file, with a given service name 
+REM
+REM Rem: The Channel Archiver Service is an example of an EPICS v4 RPC service.
+REM 
+REM
+REM Usage:  Execute helloServerRunner prior to executing helloClientRunner. 
+REM 
+REM         > ./helloServerRunner          
+REM 
+REM ----------------------------------------------------------------------------
+REM Auth: 17-Jan-2013, Dave Hickin ([email protected])
+REM ============================================================================
+
+set TOP=%~dp0
+set PATH=%TOP%bin\%EPICS_HOST_ARCH%;%TOP%..\..\pvAccessCPP\bin\%EPICS_HOST_ARCH%;%TOP%..\..\pvDataCPP\bin\%EPICS_HOST_ARCH%;%PATH%
+"%TOP%bin\%EPICS_HOST_ARCH%\HelloService.exe"

Navigate by Date:
Prev: Accessing RPC result by CSS Andreas Frei
Next: Re: exit puzzle about SNL's example Benjamin Franksen
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  <20152016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Accessing RPC result by CSS Andreas Frei
Next: Looking for MRF PCIE-EVR-300 driver on linux Xu, Shifu
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  <20152016  2017  2018  2019  2020  2021  2022  2023  2024