[ 
https://issues.apache.org/activemq/browse/AMQCPP-115?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Albert Strasheim updated AMQCPP-115:
------------------------------------

    Attachment: amqcppdllv1.diff

Here's a first cut of the patch so that we can discuss how we want to do this. 
So far I've only looked at building a DLL on Windows. Once this infrastructure 
is in place, I'll work on the autotools build.

I've added a src/main/cms/Config.h which contains the following:

#ifdef CMS_DLL
#ifdef CMS_EXPORTS
#define CMS_API __declspec(dllexport)
#else
#define CMS_API __declspec(dllimport)
#endif
#else
#define CMS_API
#endif

When building the DLL itself, you define CMS_DLL and CMS_EXPORTS. When linking 
against the DLL, you define CMS_DLL. When building the code statically (or when 
linking against the static library), you don't define anything extra. The *_DLL 
and *_EXPORTS idea comes from stuff I've seen in wxWidgets and from what Visual 
Studio's "make a DLL" wizard puts in the project it generates.

I've put the AMQCPP_DLL and AMQCPP_EXPORTS defines in activemq/util/Config.h.

Next up, I added two new configurations to the Visual Studio project files, 
namely DebugDLL and ReleaseDLL. Keeping everything in a single project file is 
handy, because this way you can build all the binaries you could need using a 
batch build. Because of our spiffy settings for the output and intermediate 
directories, the various builds don't step on each other, and everything you 
need to run the example (even when linked against the DLL) ends up in one place.

Next minor change: the static library builds were changed to produce 
libactivemq-cpp.lib and libactivemq-cppd.lib, for Release and Debug, 
respectively. The ReleaseDLL and DebugDLL builds produce activemq-cpp.dll, 
activemq-cpp.lib and activemq-cppd.dll and activemq-cppd.lib, respectively. The 
.libs are the link libraries you need to link against the DLL and differ from 
the static libraries. These naming conventions follow what the Boost project 
does for their static libraries and DLLs (they also build variants for all the 
various runtime options, but we can leave that for another day).

The only thing left to decide is which symbols we're going to export. I was 
able to get the AMQCPP example program to link by exporting everything in CMS 
(makes sense, since it's the public API) and AMQCPP's Thread and 
ActiveMQConnectionFactory classes (makes sense again... one day Thread will be 
pulled in from the Decaf lib, and ActiveMQConnectionFactory is the only class 
the user needs to know about).

We have to decide if we're going to export some or all of the other AMQCPP 
classes from the DLL. My first instinct would be not to export anything else, 
except, temporarily, the classes that are going into Decaf. The thinking here 
is that the user shouldn't know or care what classes the AMQCPP library uses to 
implement the CMS API. The user literally only needs to be able to make a 
ActiveMQConnectionFactory.

On the other hand, I've had to use a few internal AMQCPP classes to work around 
some Stomp-specific issues (Stomp's "one selector per connection" limitation). 
In this case it was handy to be able to get at a few of the internal AMQCPP 
classes. I'll investigate this code again and see what extra exports it would 
need to work.

Just remembered one other class that probably needs to be exported: 
activemq::util::Properties. By the way, the CMS API refers to this class 
directly. That is probably something that should be fixed for a future CMS API 
release.

If we go for the "export only what the user needs" route, we won't be able to 
link the unit and integration tests against the AMQCPP DLLs. This is probably 
fine. Building of the tests can simply be disabled in the DebugDLL and 
ReleaseDLL configurations (as they should be if VS stores that info in a place 
where my patch would pick it up).

By the way, the current AMQCPP Release DLL weighs in at about 1 MB. Nice and 
compact.

> Change build to create dynamic libraries
> ----------------------------------------
>
>                 Key: AMQCPP-115
>                 URL: https://issues.apache.org/activemq/browse/AMQCPP-115
>             Project: ActiveMQ C++ Client
>          Issue Type: Task
>         Environment: *nix, win32
>            Reporter: Nathan Mittler
>         Assigned To: Nathan Mittler
>            Priority: Minor
>             Fix For: 2.1
>
>         Attachments: amqcppdllv1.diff
>
>
> Based on a flurry of user requests, we need to add support for generating 
> dynamic libraries to our automake scripts and the msvc project.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to