On Saturday 21 November 2015 18:15:24 David Faure wrote:
> Yep, I see the same. I asked my colleagues (including the one who wrote
> elf-dissector and gdb-indexer, so he knows this kind of low-level stuff), but 
> even he
> doesn't know why gdb would be so much slower with a shared lib than with a 
> static lib.
> 
> I have a theory though:
> 
> $ nm -D $QTDIR/lib/libQtCore.so.4.8.7   | wc -l
> 4682
> $ nm -D $QTDIR/lib/libQtWebKit.so.4.9.4   | wc -l 
> 3112
> $ nm  -D $KDEDIR/librosegardenprivate.so | wc -l          
> 54854
> 
> In *all* the libs I have in $KDEDIR/lib, the one with most symbols is 
> libkdeui.so: 11535.
> rosegarden's lib is far above that.
> 
> So I'll try enabling -fvisibility=hidden and adding the necessary export 
> macros, it should at least help with this.

Here's the resulting patch.

After this patch, nm -D librosegardenprivate.so| wc -l
12733
Much better.

I'm not sure it changes much for gdb though. In my tests,
the time for `start` in gdb went down from 20s to 17s.
But maybe for your use case (core file) it's different, so feel free
to give it a test.

-- 
David Faure, [email protected], http://www.davidfaure.fr
Working on KDE Frameworks 5
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1320815..bb5ff41 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -102,6 +102,7 @@ if(CMAKE_COMPILER_IS_GNUCXX)
    if(CMAKE_SYSTEM_NAME MATCHES Linux OR CMAKE_SYSTEM_NAME STREQUAL GNU)
       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -W -Wpointer-arith -fno-check-new -fno-common")
       add_definitions(-DQT_NO_EXCEPTIONS)
+      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
    endif()
 endif()
 
@@ -191,6 +192,7 @@ if(BUILD_TESTING)
     message(STATUS "Building unit tests, using shared libraries")
 else()
     set(RG_LIBRARY_TYPE STATIC)
+    set(ROSEGARDENPRIVATE_STATIC_BUILD TRUE) # for generating rosegardenprivate-export.h
     message(STATUS "Not building unit tests, using a static library for rosegarden")
 endif()
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e67a699..de7d4fe 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -5,7 +5,11 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
 
 # Compiler definitions
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rosegarden-version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/rosegarden-version.h )
+configure_file(rosegarden-version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/rosegarden-version.h )
+
+# Export macros
+configure_file(rosegardenprivate_export.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/rosegardenprivate_export.h)
+add_definitions(-DROSEGARDENPRIVATE_LIB_MAKEDLL)
 
 # Define the include paths (-I...)
 include_directories(
diff --git a/src/base/NotationTypes.cpp b/src/base/NotationTypes.cpp
index 1e447c4..c2c443e 100644
--- a/src/base/NotationTypes.cpp
+++ b/src/base/NotationTypes.cpp
@@ -48,21 +48,21 @@ namespace Accidentals
      * based on the performance pitch and current key at the
      * location of the note.
      */
-    const Accidental NoAccidental = "no-accidental";
+    ROSEGARDENPRIVATE_EXPORT const Accidental NoAccidental = "no-accidental";
 
-    const Accidental Sharp = "sharp";
-    const Accidental Flat = "flat";
-    const Accidental Natural = "natural";
-    const Accidental DoubleSharp = "double-sharp";
-    const Accidental DoubleFlat = "double-flat";
+    ROSEGARDENPRIVATE_EXPORT const Accidental Sharp = "sharp";
+    ROSEGARDENPRIVATE_EXPORT const Accidental Flat = "flat";
+    ROSEGARDENPRIVATE_EXPORT const Accidental Natural = "natural";
+    ROSEGARDENPRIVATE_EXPORT const Accidental DoubleSharp = "double-sharp";
+    ROSEGARDENPRIVATE_EXPORT const Accidental DoubleFlat = "double-flat";
 
     // Additional Accidentals for demi- and sesqui- sharps and flats
-    const Accidental QuarterFlat = "demiflat";
-    const Accidental ThreeQuarterFlat =  "sesqiflat";
-    const Accidental QuarterSharp = "demisharp";
-    const Accidental ThreeQuarterSharp = "sesquisharp";
+    ROSEGARDENPRIVATE_EXPORT const Accidental QuarterFlat = "demiflat";
+    ROSEGARDENPRIVATE_EXPORT const Accidental ThreeQuarterFlat =  "sesqiflat";
+    ROSEGARDENPRIVATE_EXPORT const Accidental QuarterSharp = "demisharp";
+    ROSEGARDENPRIVATE_EXPORT const Accidental ThreeQuarterSharp = "sesquisharp";
 
-    AccidentalList getStandardAccidentals() {
+    ROSEGARDENPRIVATE_EXPORT AccidentalList getStandardAccidentals() {
 
         static Accidental a[] = {
             NoAccidental, Sharp, Flat, Natural, DoubleSharp, DoubleFlat
@@ -76,7 +76,7 @@ namespace Accidentals
         return v;
     }
 
-    int getPitchOffset(const Accidental &acc) {
+    ROSEGARDENPRIVATE_EXPORT int getPitchOffset(const Accidental &acc) {
         if (acc == DoubleSharp) return 2;
         else if (acc == Sharp) return 1;
         else if (acc == Flat) return -1;
@@ -84,7 +84,7 @@ namespace Accidentals
         else return 0;
     }
 
-    Accidental getAccidental(int pitchChange) {
+    ROSEGARDENPRIVATE_EXPORT Accidental getAccidental(int pitchChange) {
         if (pitchChange == -2) return DoubleFlat;
         if (pitchChange == -1) return Flat;
         // Yielding 'Natural' will add a natural-sign even if not needed, so for now
@@ -104,69 +104,69 @@ using namespace Accidentals;
 
 namespace Marks
 {
-    const Mark NoMark = "no-mark";
-    const Mark Accent = "accent";
-    const Mark Tenuto = "tenuto";
-    const Mark Staccato = "staccato";
-    const Mark Staccatissimo = "staccatissimo";
-    const Mark Marcato = "marcato";
-    const Mark Open = "open";
-    const Mark Stopped = "stopped";
-    const Mark Harmonic = "harmonic";
-    const Mark Sforzando = getTextMark("sf");
-    const Mark Rinforzando = getTextMark("rf");
-    const Mark Trill = "trill";
-    const Mark LongTrill = "long-trill";
-    const Mark TrillLine = "trill-line";
-    const Mark Turn = "turn";
-    const Mark Pause = "pause";
-    const Mark UpBow = "up-bow";
-    const Mark DownBow = "down-bow";
-
-    const Mark Mordent = "mordent";
-    const Mark MordentInverted = "mordent-inverted";
-    const Mark MordentLong = "mordent-long";
-    const Mark MordentLongInverted = "mordent-long-inverted";
-
-    string getTextMark(string text) {
+    ROSEGARDENPRIVATE_EXPORT const Mark NoMark = "no-mark";
+    ROSEGARDENPRIVATE_EXPORT const Mark Accent = "accent";
+    ROSEGARDENPRIVATE_EXPORT const Mark Tenuto = "tenuto";
+    ROSEGARDENPRIVATE_EXPORT const Mark Staccato = "staccato";
+    ROSEGARDENPRIVATE_EXPORT const Mark Staccatissimo = "staccatissimo";
+    ROSEGARDENPRIVATE_EXPORT const Mark Marcato = "marcato";
+    ROSEGARDENPRIVATE_EXPORT const Mark Open = "open";
+    ROSEGARDENPRIVATE_EXPORT const Mark Stopped = "stopped";
+    ROSEGARDENPRIVATE_EXPORT const Mark Harmonic = "harmonic";
+    ROSEGARDENPRIVATE_EXPORT const Mark Sforzando = getTextMark("sf");
+    ROSEGARDENPRIVATE_EXPORT const Mark Rinforzando = getTextMark("rf");
+    ROSEGARDENPRIVATE_EXPORT const Mark Trill = "trill";
+    ROSEGARDENPRIVATE_EXPORT const Mark LongTrill = "long-trill";
+    ROSEGARDENPRIVATE_EXPORT const Mark TrillLine = "trill-line";
+    ROSEGARDENPRIVATE_EXPORT const Mark Turn = "turn";
+    ROSEGARDENPRIVATE_EXPORT const Mark Pause = "pause";
+    ROSEGARDENPRIVATE_EXPORT const Mark UpBow = "up-bow";
+    ROSEGARDENPRIVATE_EXPORT const Mark DownBow = "down-bow";
+
+    ROSEGARDENPRIVATE_EXPORT const Mark Mordent = "mordent";
+    ROSEGARDENPRIVATE_EXPORT const Mark MordentInverted = "mordent-inverted";
+    ROSEGARDENPRIVATE_EXPORT const Mark MordentLong = "mordent-long";
+    ROSEGARDENPRIVATE_EXPORT const Mark MordentLongInverted = "mordent-long-inverted";
+
+    ROSEGARDENPRIVATE_EXPORT string getTextMark(string text) {
         return string("text_") + text;
     }
 
-    bool isTextMark(Mark mark) {
+    ROSEGARDENPRIVATE_EXPORT bool isTextMark(Mark mark) {
         return string(mark).substr(0, 5) == "text_";
     }
 
-    string getTextFromMark(Mark mark) {
+    ROSEGARDENPRIVATE_EXPORT string getTextFromMark(Mark mark) {
         if (!isTextMark(mark)) return string();
         else return string(mark).substr(5);
     }
 
-    string getFingeringMark(string fingering) {
+    ROSEGARDENPRIVATE_EXPORT string getFingeringMark(string fingering) {
         return string("finger_") + fingering;
     }
 
-    bool isFingeringMark(Mark mark) {
+    ROSEGARDENPRIVATE_EXPORT bool isFingeringMark(Mark mark) {
         return string(mark).substr(0, 7) == "finger_";
     }
 
-    bool isApplicableToRests(Mark mark) {
+    ROSEGARDENPRIVATE_EXPORT bool isApplicableToRests(Mark mark) {
         if (mark == Marks::Pause) return true;
         if (isTextMark(mark)) return true;
         return false;
     }
 
-    string getFingeringFromMark(Mark mark) {
+    ROSEGARDENPRIVATE_EXPORT string getFingeringFromMark(Mark mark) {
         if (!isFingeringMark(mark)) return string();
         else return string(mark).substr(7);
     }
 
-    int getMarkCount(const Event &e) {
+    ROSEGARDENPRIVATE_EXPORT int getMarkCount(const Event &e) {
         long markCount = 0;
         e.get<Int>(BaseProperties::MARK_COUNT, markCount);
         return markCount;
     }
 
-    std::vector<Mark> getMarks(const Event &e) {
+    ROSEGARDENPRIVATE_EXPORT std::vector<Mark> getMarks(const Event &e) {
 
 	std::vector<Mark> marks;
 
@@ -185,7 +185,7 @@ namespace Marks
 	return marks;
     }
 
-    Mark getFingeringMark(const Event &e) {
+    ROSEGARDENPRIVATE_EXPORT Mark getFingeringMark(const Event &e) {
 
 	long markCount = 0;
 	e.get<Int>(BaseProperties::MARK_COUNT, markCount);
@@ -202,7 +202,7 @@ namespace Marks
 	return NoMark;
     }
 
-    void addMark(Event &e, const Mark &mark, bool unique) {
+    ROSEGARDENPRIVATE_EXPORT void addMark(Event &e, const Mark &mark, bool unique) {
 	if (unique && hasMark(e, mark)) return;
 
 	long markCount = 0;
@@ -213,7 +213,7 @@ namespace Marks
 	e.set<String>(markProperty, mark);
     }
 
-    bool removeMark(Event &e, const Mark &mark) {
+    ROSEGARDENPRIVATE_EXPORT bool removeMark(Event &e, const Mark &mark) {
 
 	long markCount = 0;
 	e.get<Int>(BaseProperties::MARK_COUNT, markCount);
@@ -239,7 +239,7 @@ namespace Marks
 	return false;
     }
 
-    bool hasMark(const Event &e, const Mark &mark) {
+    ROSEGARDENPRIVATE_EXPORT bool hasMark(const Event &e, const Mark &mark) {
 	long markCount = 0;
 	e.get<Int>(BaseProperties::MARK_COUNT, markCount);
 
@@ -253,7 +253,7 @@ namespace Marks
 	return false;
     }
 
-    std::vector<Mark> getStandardMarks() {
+    ROSEGARDENPRIVATE_EXPORT std::vector<Mark> getStandardMarks() {
 
         static Mark a[] = {
             NoMark, Accent, Tenuto, Staccato, Staccatissimo, Marcato, Open,
diff --git a/src/base/NotationTypes.h b/src/base/NotationTypes.h
index 835d1e9..46f701b 100644
--- a/src/base/NotationTypes.h
+++ b/src/base/NotationTypes.h
@@ -19,6 +19,8 @@
 #include <list>
 #include <map>
 
+#include <rosegardenprivate_export.h>
+
 #include "Event.h"
 
 /*
@@ -60,7 +62,7 @@
 namespace Rosegarden 
 {
 
-extern const int MIN_SUBORDERING;
+extern ROSEGARDENPRIVATE_EXPORT const int MIN_SUBORDERING;
 
 typedef std::list<int> DurationList;
 
@@ -77,16 +79,16 @@ typedef std::string Accidental;
 
 namespace Accidentals
 {
-    extern const Accidental NoAccidental;
-    extern const Accidental Sharp;
-    extern const Accidental Flat;
-    extern const Accidental Natural;
-    extern const Accidental DoubleSharp;
-    extern const Accidental DoubleFlat;
-    extern const Accidental QuarterFlat;
-    extern const Accidental ThreeQuarterFlat;
-    extern const Accidental QuarterSharp;
-    extern const Accidental ThreeQuarterSharp;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental NoAccidental;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental Sharp;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental Flat;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental Natural;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental DoubleSharp;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental DoubleFlat;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental QuarterFlat;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental ThreeQuarterFlat;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental QuarterSharp;
+    extern ROSEGARDENPRIVATE_EXPORT const Accidental ThreeQuarterSharp;
 
     typedef std::vector<Accidental> AccidentalList;
 
@@ -111,7 +113,7 @@ namespace Accidentals
      * Get the predefined accidentals (i.e. the ones listed above)
      * in their defined order.
      */
-    extern AccidentalList getStandardAccidentals();
+    extern ROSEGARDENPRIVATE_EXPORT AccidentalList getStandardAccidentals();
 
     /**
      * Get the change in pitch resulting from an accidental: -1 for
@@ -120,7 +122,7 @@ namespace Accidentals
      * effect of an accidental depends on the key as well -- see
      * the Key and Pitch classes.
      */
-    extern int getPitchOffset(const Accidental &accidental);
+    extern ROSEGARDENPRIVATE_EXPORT int getPitchOffset(const Accidental &accidental);
 
 
     /**
@@ -130,7 +132,7 @@ namespace Accidentals
      * Useful for tying to code that represents accidentals by 
      * their pitch change.
      */
-    extern Accidental getAccidental(int pitchChange);
+    extern ROSEGARDENPRIVATE_EXPORT Accidental getAccidental(int pitchChange);
 }
 
 
@@ -142,51 +144,51 @@ typedef std::string Mark;
   
 namespace Marks //!!! This would be better as a class, these days
 {
-    extern const Mark NoMark;         // " "
+    extern ROSEGARDENPRIVATE_EXPORT const Mark NoMark;         // " "
 
-    extern const Mark Accent;         // ">"
-    extern const Mark Tenuto;         // "-"  ("legato" in RG2.1)
-    extern const Mark Staccato;       // "."
-    extern const Mark Staccatissimo;  // "'"
-    extern const Mark Marcato;        // "^"
-    extern const Mark Open;           // "o"
-    extern const Mark Stopped;        // "+"
-    extern const Mark Harmonic;       // "°"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Accent;         // ">"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Tenuto;         // "-"  ("legato" in RG2.1)
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Staccato;       // "."
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Staccatissimo;  // "'"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Marcato;        // "^"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Open;           // "o"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Stopped;        // "+"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Harmonic;       // "°"
 
-    extern const Mark Sforzando;      // "sf"
-    extern const Mark Rinforzando;    // "rf"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Sforzando;      // "sf"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Rinforzando;    // "rf"
 
-    extern const Mark Trill;          // "tr"
-    extern const Mark LongTrill;      // with wiggly line
-    extern const Mark TrillLine;      // line on its own
-    extern const Mark Turn;           // "~"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Trill;          // "tr"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark LongTrill;      // with wiggly line
+    extern ROSEGARDENPRIVATE_EXPORT const Mark TrillLine;      // line on its own
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Turn;           // "~"
 
-    extern const Mark Pause;          // aka "fermata"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Pause;          // aka "fermata"
 
-    extern const Mark UpBow;          // "v"
-    extern const Mark DownBow;        // a square with the bottom side missing
+    extern ROSEGARDENPRIVATE_EXPORT const Mark UpBow;          // "v"
+    extern ROSEGARDENPRIVATE_EXPORT const Mark DownBow;        // a square with the bottom side missing
 
-    extern const Mark Mordent;
-    extern const Mark MordentInverted;
-    extern const Mark MordentLong;
-    extern const Mark MordentLongInverted;
+    extern ROSEGARDENPRIVATE_EXPORT const Mark Mordent;
+    extern ROSEGARDENPRIVATE_EXPORT const Mark MordentInverted;
+    extern ROSEGARDENPRIVATE_EXPORT const Mark MordentLong;
+    extern ROSEGARDENPRIVATE_EXPORT const Mark MordentLongInverted;
 
     /**
      * Given a string, return a mark that will be recognised as a
      * text mark containing that string.  For example, the Sforzando
      * mark is actually defined as getTextMark("sf").
      */
-    extern Mark getTextMark(std::string text);
+    extern ROSEGARDENPRIVATE_EXPORT Mark getTextMark(std::string text);
 
     /**
      * Return true if the given mark is a text mark.
      */
-    extern bool isTextMark(Mark mark);
+    extern ROSEGARDENPRIVATE_EXPORT bool isTextMark(Mark mark);
 
     /**
      * Extract the string from a text mark.
      */
-    extern std::string getTextFromMark(Mark mark);
+    extern ROSEGARDENPRIVATE_EXPORT std::string getTextFromMark(Mark mark);
 
     /**
      * Given a string, return a mark that will be recognised as a
@@ -194,62 +196,62 @@ namespace Marks //!!! This would be better as a class, these days
      * instead of a number to permit "fingering" marks containing
      * labels like "+".)
      */
-    extern Mark getFingeringMark(std::string fingering);
+    extern ROSEGARDENPRIVATE_EXPORT Mark getFingeringMark(std::string fingering);
 
     /**
      * Return true if the given mark is a fingering mark.
      */
-    extern bool isFingeringMark(Mark mark);
+    extern ROSEGARDENPRIVATE_EXPORT bool isFingeringMark(Mark mark);
 
     /**
      * Extract the string from a fingering mark.
      */
-    extern std::string getFingeringFromMark(Mark mark);
+    extern ROSEGARDENPRIVATE_EXPORT std::string getFingeringFromMark(Mark mark);
 
     /**
      * Return true if the given mark makes sense when applied to a rest.
      */
-    extern bool isApplicableToRests(Mark mark);
+    extern ROSEGARDENPRIVATE_EXPORT bool isApplicableToRests(Mark mark);
 
     /**
      * Extract the number of marks from an event.
      */
-    extern int getMarkCount(const Event &e);
+    extern ROSEGARDENPRIVATE_EXPORT int getMarkCount(const Event &e);
 
     /**
      * Extract the marks from an event.
      */
-    extern std::vector<Mark> getMarks(const Event &e);
+    extern ROSEGARDENPRIVATE_EXPORT std::vector<Mark> getMarks(const Event &e);
 
     /**
      * Return the first fingering mark on an event (or NoMark, if none).
      */
-    extern Mark getFingeringMark(const Event &e);
+    extern ROSEGARDENPRIVATE_EXPORT Mark getFingeringMark(const Event &e);
 
     /**
      * Add a mark to an event.  If unique is true, add the mark only
      * if the event does not already have it (otherwise permit
      * multiple identical marks).
      */
-    extern void addMark(Event &e, const Mark &mark, bool unique);
+    extern ROSEGARDENPRIVATE_EXPORT void addMark(Event &e, const Mark &mark, bool unique);
 
     /**
      * Remove a mark from an event.  Returns true if the mark was
      * there to remove.  If the mark was not unique, removes only
      * the first instance of it.
      */
-    extern bool removeMark(Event &e, const Mark &mark);
+    extern ROSEGARDENPRIVATE_EXPORT bool removeMark(Event &e, const Mark &mark);
 
     /**
      * Returns true if the event has the given mark.
      */
-    extern bool hasMark(const Event &e, const Mark &mark);
+    extern ROSEGARDENPRIVATE_EXPORT bool hasMark(const Event &e, const Mark &mark);
 
     /**
      * Get the predefined marks (i.e. the ones listed above) in their
      * defined order.
      */
-    extern std::vector<Mark> getStandardMarks();
+    extern ROSEGARDENPRIVATE_EXPORT std::vector<Mark> getStandardMarks();
 }
 
 
@@ -259,7 +261,7 @@ namespace Marks //!!! This would be better as a class, these days
  * provides a few bits of information about the clefs.
  */
 
-class Clef
+class ROSEGARDENPRIVATE_EXPORT Clef
 {
 public:
     static const std::string EventType;
@@ -381,7 +383,7 @@ private:
  * transposing between keys.
  */
 
-class Key 
+class ROSEGARDENPRIVATE_EXPORT Key
 {
 public:
     static const std::string EventType;
@@ -774,7 +776,7 @@ private:
  * This completely replaces the older NotationDisplayPitch class. 
  */
 
-class Pitch
+class ROSEGARDENPRIVATE_EXPORT Pitch
 {
 public:
     /**
@@ -1031,7 +1033,7 @@ class TimeSignature;
  * note events.  You can construct one of these from either.
  */
 
-class Note
+class ROSEGARDENPRIVATE_EXPORT Note
 {
 public:
     static const std::string EventType;
@@ -1128,7 +1130,7 @@ private:
  * but only in the Composition's reference segment.
  */
 
-class TimeSignature
+class ROSEGARDENPRIVATE_EXPORT TimeSignature
 {
 public:
     static const TimeSignature DefaultTimeSignature;
@@ -1316,7 +1318,7 @@ private:
  * and call newBar() or newClef() when a new bar happens or a new
  * clef is encountered.
  */
-class AccidentalTable
+class ROSEGARDENPRIVATE_EXPORT AccidentalTable
 {
 public:
     enum OctaveType {
@@ -1377,7 +1379,7 @@ private:
  *
  * \author D. Michael McIntyre
  */
-class Symbol
+class ROSEGARDENPRIVATE_EXPORT Symbol
 {
 public:
     static const std::string EventType;
diff --git a/src/base/RealTime.h b/src/base/RealTime.h
index 1d4c374..998dacb 100644
--- a/src/base/RealTime.h
+++ b/src/base/RealTime.h
@@ -19,12 +19,14 @@
 #include <iostream>
 #include <string>
 
+#include <rosegardenprivate_export.h>
+
 struct timeval;
 
 namespace Rosegarden 
 {
 
-struct RealTime
+struct ROSEGARDENPRIVATE_EXPORT RealTime
 {
     int sec;
     int nsec;
diff --git a/src/base/Segment.h b/src/base/Segment.h
index 9da19dc..5d086af 100644
--- a/src/base/Segment.h
+++ b/src/base/Segment.h
@@ -66,7 +66,7 @@ class BasicCommand;
  *     They provide no virtual dtor.  EventContainer should instead
  *     have a std::multiset member object.
  */
-class EventContainer : public std::multiset<Event*, Event::EventCmp>
+class ROSEGARDENPRIVATE_EXPORT EventContainer : public std::multiset<Event*, Event::EventCmp>
 {
  public:
     iterator findEventOfType(iterator i, const std::string &type);
@@ -91,7 +91,7 @@ class EventContainer : public std::multiset<Event*, Event::EventCmp>
  *
  * The Segment owns the Events its items are pointing at.
  */
-class Segment : public QObject, public EventContainer
+class ROSEGARDENPRIVATE_EXPORT Segment : public QObject, public EventContainer
 {
   Q_OBJECT
 
@@ -1013,7 +1013,7 @@ typedef Segment::SegmentMultiSet SegmentMultiSet;
 /**
  * See Segment::addObserver() and Segment::m_observers.
  */
-class SegmentObserver
+class ROSEGARDENPRIVATE_EXPORT SegmentObserver
 {
 public:
     virtual ~SegmentObserver() {}
diff --git a/src/base/Selection.h b/src/base/Selection.h
index 7b349fa..7eaec4b 100644
--- a/src/base/Selection.h
+++ b/src/base/Selection.h
@@ -40,7 +40,7 @@ public:
  * does not take a copy of those Events, it just remembers which ones they are.
  */
 
-class EventSelection : public SegmentObserver
+class ROSEGARDENPRIVATE_EXPORT EventSelection : public SegmentObserver
 {
 public:
     typedef EventContainer eventcontainer;
diff --git a/src/commands/segment/SegmentTransposeCommand.h b/src/commands/segment/SegmentTransposeCommand.h
index 0de7df0..98f9389 100644
--- a/src/commands/segment/SegmentTransposeCommand.h
+++ b/src/commands/segment/SegmentTransposeCommand.h
@@ -31,7 +31,7 @@ namespace Rosegarden
 class Segment;
 
 
-class SegmentTransposeCommand : public MacroCommand
+class ROSEGARDENPRIVATE_EXPORT SegmentTransposeCommand : public MacroCommand
 {
     Q_DECLARE_TR_FUNCTIONS(Rosegarden::SegmentTransposeCommand)
 
diff --git a/src/document/RosegardenDocument.h b/src/document/RosegardenDocument.h
index 56d00ee..82e734e 100644
--- a/src/document/RosegardenDocument.h
+++ b/src/document/RosegardenDocument.h
@@ -76,7 +76,7 @@ static const int MERGE_KEEP_NEW_TIMINGS = (1 << 3);
   * RosegardenDocument owns the Composition in the document.
   */
 
-class RosegardenDocument : public QObject
+class ROSEGARDENPRIVATE_EXPORT RosegardenDocument : public QObject
 {
     Q_OBJECT
 public:
diff --git a/src/document/io/LilyPondExporter.h b/src/document/io/LilyPondExporter.h
index 92e539e..c692b43 100644
--- a/src/document/io/LilyPondExporter.h
+++ b/src/document/io/LilyPondExporter.h
@@ -86,7 +86,7 @@ const std::string headerTagline = "tagline";
  * LilyPond scorefile export
  */
 
-class LilyPondExporter : public ProgressReporter
+class ROSEGARDENPRIVATE_EXPORT LilyPondExporter : public ProgressReporter
 {
     //Q_OBJECT
 public:
diff --git a/src/gui/application/RosegardenApplication.cpp b/src/gui/application/RosegardenApplication.cpp
index 1ee0081..8d715a4 100644
--- a/src/gui/application/RosegardenApplication.cpp
+++ b/src/gui/application/RosegardenApplication.cpp
@@ -36,8 +36,7 @@
 #include <QSettings>
 
 
-namespace Rosegarden
-{
+using namespace Rosegarden;
 
 static bool s_noSequencerMode = false;
 
@@ -87,10 +86,24 @@ void RosegardenApplication::slotSetStatusMessage(QString msg)
 
 }
 
+// to be outside the Rosegarden namespace
+static void initResources()
+{
+    // Initialize .qrc resources (necessary when using a static lib)
+    Q_INIT_RESOURCE(data);
+    Q_INIT_RESOURCE(locale);
+}
+
+RosegardenApplication::RosegardenApplication(int &argc, char **argv) :
+    QApplication(argc, argv) {
+
+    initResources();
+}
+
 void
 RosegardenApplication::refreshGUI(int /* maxTime */)
 {
-//    eventLoop()->processEvents(QEventLoop::ExcludeUserInput |                 //&&& eventLoop()->processEvents()
+    //    eventLoop()->processEvents(QEventLoop::ExcludeUserInput |                 //&&& eventLoop()->processEvents()
 //                               QEventLoop::ExcludeSocketNotifiers,
    //                            maxTime);
 }
@@ -125,6 +138,3 @@ RosegardenApplication::notify(QObject * receiver, QEvent * event)
         return false;
     }
 }
-
-}
-
diff --git a/src/gui/application/RosegardenApplication.h b/src/gui/application/RosegardenApplication.h
index 60e4702..efd2fb1 100644
--- a/src/gui/application/RosegardenApplication.h
+++ b/src/gui/application/RosegardenApplication.h
@@ -22,6 +22,7 @@
 #include <QByteArray>
 #include <QString>
 
+#include <rosegardenprivate_export.h>
 
 class QSessionManager;
 class QProcess;
@@ -38,12 +39,11 @@ namespace Rosegarden
  * Handles RosegardenMainWindow's perceived uniqueness for us.
  *
  */
-class RosegardenApplication : public QApplication
+class ROSEGARDENPRIVATE_EXPORT RosegardenApplication : public QApplication
 {
     Q_OBJECT
 public:
-    RosegardenApplication(int &argc, char **argv) :
-        QApplication(argc, argv) {}
+    RosegardenApplication(int &argc, char **argv);
 
     /**
      * Handle the attempt at creation of a new instance - 
diff --git a/src/gui/application/RosegardenMainWindow.h b/src/gui/application/RosegardenMainWindow.h
index e034926..bd1583a 100644
--- a/src/gui/application/RosegardenMainWindow.h
+++ b/src/gui/application/RosegardenMainWindow.h
@@ -41,6 +41,8 @@
 #include <map>
 #include <set>
 
+#include <rosegardenprivate_export.h>
+
 class QWidget;
 class QTimer;
 class QTextCodec;
@@ -113,7 +115,7 @@ class ConfigureDialog;
   *     contains the TrackEditor.
   *   * getTransport() returns the TransportDialog instance.
   */
-class RosegardenMainWindow : public QMainWindow, public ActionFileClient
+class ROSEGARDENPRIVATE_EXPORT RosegardenMainWindow : public QMainWindow, public ActionFileClient
 {
     Q_OBJECT
     
diff --git a/src/gui/application/main.cpp b/src/gui/application/main.cpp
index c5f5ecb..b751f7e 100644
--- a/src/gui/application/main.cpp
+++ b/src/gui/application/main.cpp
@@ -451,9 +451,6 @@ int main(int argc, char *argv[])
 
     std::cout << "Thorn - " << std::boolalpha << Thorn << std::endl;
 
-    Q_INIT_RESOURCE(data);
-    Q_INIT_RESOURCE(locale);
-
     // In order to ensure the Thorn style comes out right, we need to set our
     // custom style, which is based on QPlastiqueStyle
     if (Thorn) QApplication::setStyle(new ThornStyle);
diff --git a/src/gui/dialogs/IntervalDialog.h b/src/gui/dialogs/IntervalDialog.h
index c218e1d..c4742c3 100644
--- a/src/gui/dialogs/IntervalDialog.h
+++ b/src/gui/dialogs/IntervalDialog.h
@@ -23,6 +23,7 @@
 #include <vector>
 #include "gui/widgets/DiatonicPitchChooser.h"
 
+#include <rosegardenprivate_export.h>
 
 class QWidget;
 class QComboBox;
@@ -36,7 +37,7 @@ namespace Rosegarden
 class RosegardenDocument;
 
 
-class IntervalDialog : public QDialog
+class ROSEGARDENPRIVATE_EXPORT IntervalDialog : public QDialog
 {
     Q_OBJECT
 public:
diff --git a/src/gui/general/IconLoader.h b/src/gui/general/IconLoader.h
index 1c4fd12..12eefb3 100644
--- a/src/gui/general/IconLoader.h
+++ b/src/gui/general/IconLoader.h
@@ -23,10 +23,11 @@
 #include <QString>
 
 #include <map>
+#include <rosegardenprivate_export.h>
 
 namespace Rosegarden {
 
-class IconLoader
+class ROSEGARDENPRIVATE_EXPORT IconLoader
 {
 public:
     IconLoader() { }
diff --git a/src/gui/general/ProgressReporter.h b/src/gui/general/ProgressReporter.h
index 2fe63ea..26600d7 100644
--- a/src/gui/general/ProgressReporter.h
+++ b/src/gui/general/ProgressReporter.h
@@ -21,7 +21,7 @@
 
 #include <QObject>
 
-
+#include <rosegardenprivate_export.h>
 
 
 namespace Rosegarden
@@ -29,7 +29,7 @@ namespace Rosegarden
 
 
 
-class ProgressReporter : public QObject
+class ROSEGARDENPRIVATE_EXPORT ProgressReporter : public QObject
 {
     Q_OBJECT
 public:
diff --git a/src/gui/general/ResourceFinder.h b/src/gui/general/ResourceFinder.h
index 91827e0..c0591ab 100644
--- a/src/gui/general/ResourceFinder.h
+++ b/src/gui/general/ResourceFinder.h
@@ -16,10 +16,11 @@
 #define RG_RESOURCE_FINDER_H
 
 #include <QString>
+#include <rosegardenprivate_export.h>
 
 namespace Rosegarden {
 	
-class ResourceFinder
+class ROSEGARDENPRIVATE_EXPORT ResourceFinder
 {
 public:
     ResourceFinder() { }
diff --git a/src/gui/general/ThornStyle.h b/src/gui/general/ThornStyle.h
index c480b38..2b5624b 100644
--- a/src/gui/general/ThornStyle.h
+++ b/src/gui/general/ThornStyle.h
@@ -20,7 +20,7 @@
 
 #include <QPlastiqueStyle>
 #include <QIcon>
-
+#include <rosegardenprivate_export.h>
 
 namespace Rosegarden
 {
@@ -29,7 +29,7 @@ namespace Rosegarden
 /** Subclass QPlastiqueStyle so we can define our own custom icons for
  * QMessageBox and so on and make them look better in the Thorn style.
  */
-class ThornStyle : public QPlastiqueStyle
+class ROSEGARDENPRIVATE_EXPORT ThornStyle : public QPlastiqueStyle
 {
     Q_OBJECT
 
diff --git a/src/gui/widgets/CurrentProgressDialog.h b/src/gui/widgets/CurrentProgressDialog.h
index 048dc58..662d864 100644
--- a/src/gui/widgets/CurrentProgressDialog.h
+++ b/src/gui/widgets/CurrentProgressDialog.h
@@ -20,7 +20,7 @@
 
 #include <QObject>
 
-
+#include <rosegardenprivate_export.h>
 
 
 namespace Rosegarden
@@ -29,7 +29,7 @@ namespace Rosegarden
 class ProgressDialog;
 
 
-class CurrentProgressDialog : public QObject
+class ROSEGARDENPRIVATE_EXPORT CurrentProgressDialog : public QObject
 {
     Q_OBJECT
 public:
diff --git a/src/gui/widgets/StartupLogo.h b/src/gui/widgets/StartupLogo.h
index 48e2f83..44e2164 100644
--- a/src/gui/widgets/StartupLogo.h
+++ b/src/gui/widgets/StartupLogo.h
@@ -22,10 +22,12 @@
 #include <QWidget>
 #include <QPixmap>
 
+#include <rosegardenprivate_export.h>
+
 namespace Rosegarden
 {
 
-class StartupLogo : public QWidget
+class ROSEGARDENPRIVATE_EXPORT StartupLogo : public QWidget
 {
     Q_OBJECT
 
diff --git a/src/misc/ConfigGroups.cpp b/src/misc/ConfigGroups.cpp
index cc845a5..8ebc2f7 100644
--- a/src/misc/ConfigGroups.cpp
+++ b/src/misc/ConfigGroups.cpp
@@ -20,7 +20,7 @@ namespace Rosegarden
     //
     // QSettings group names
     //
-    const char* const GeneralOptionsConfigGroup = "General_Options";
+    ROSEGARDENPRIVATE_EXPORT const char* const GeneralOptionsConfigGroup = "General_Options";
     const char* const LatencyOptionsConfigGroup = "Latency_Options";
     const char* const SequencerOptionsConfigGroup = "Sequencer_Options";
     const char* const NotationViewConfigGroup = "Notation_Options";
@@ -45,7 +45,7 @@ namespace Rosegarden
     const char* const EditViewConfigGroup = "Edit_View";
     const char* const PresetDialogConfigGroup = "Parameter_Presets";
     const char* const ExternalApplicationsConfigGroup = "External_Applications";
-    const char* const LilyPondExportConfigGroup = "LilyPond_Export";
+    ROSEGARDENPRIVATE_EXPORT const char* const LilyPondExportConfigGroup = "LilyPond_Export";
     const char* const MusicXMLExportConfigGroup = "MusicXML_Export";
     const char* const LastUsedPathsConfigGroup = "Last_Used_Paths";
     const char* const WindowGeometryConfigGroup = "Window_Geometry";
diff --git a/src/misc/ConfigGroups.h b/src/misc/ConfigGroups.h
index 4eb946b..74c0746 100644
--- a/src/misc/ConfigGroups.h
+++ b/src/misc/ConfigGroups.h
@@ -21,11 +21,13 @@
 #ifndef RG_CONFIG_GROUPS_H
 #define RG_CONFIG_GROUPS_H
 
+#include <rosegardenprivate_export.h>
+
 namespace Rosegarden 
 {
-    extern const char* const GeneralOptionsConfigGroup;
+    extern ROSEGARDENPRIVATE_EXPORT const char* const GeneralOptionsConfigGroup;
     extern const char* const LatencyOptionsConfigGroup;
-    extern const char* const SequencerOptionsConfigGroup;
+    extern ROSEGARDENPRIVATE_EXPORT const char* const SequencerOptionsConfigGroup;
     extern const char* const NotationViewConfigGroup;
     extern const char* const PitchTrackerConfigGroup;
     extern const char* const AudioManagerDialogConfigGroup;
@@ -48,7 +50,7 @@ namespace Rosegarden
     extern const char* const EditViewConfigGroup;
     extern const char* const PresetDialogConfigGroup;
     extern const char* const ExternalApplicationsConfigGroup;
-    extern const char* const LilyPondExportConfigGroup;
+    extern ROSEGARDENPRIVATE_EXPORT const char* const LilyPondExportConfigGroup;
     extern const char* const MusicXMLExportConfigGroup;
     extern const char* const LastUsedPathsConfigGroup;
     extern const char* const WindowGeometryConfigGroup;
diff --git a/src/misc/Debug.cpp b/src/misc/Debug.cpp
index 5241b65..e55605b 100644
--- a/src/misc/Debug.cpp
+++ b/src/misc/Debug.cpp
@@ -28,16 +28,14 @@ namespace Rosegarden
 {
 
 
-QDebug &
-operator<<(QDebug &dbg, const std::string &s)
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &dbg, const std::string &s)
 {
     dbg << strtoqstr(s);
 
     return dbg;
 }
 
-QDebug &
-operator<<(QDebug &dbg, const Rosegarden::Event &e)
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &dbg, const Rosegarden::Event &e)
 {
     dbg << "Event type : " << e.getType() << '\n';
     dbg << "\tDuration : " << e.getDuration() << '\n';
@@ -54,8 +52,7 @@ operator<<(QDebug &dbg, const Rosegarden::Event &e)
     return dbg;
 }
 
-QDebug &
-operator<<(QDebug &dbg, const Rosegarden::Segment &t)
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &dbg, const Rosegarden::Segment &t)
 {
 //    dbg << "Segment for instrument " << t.getTrack()
 //        << " starting at " << t.getStartTime() << '\n';
@@ -86,22 +83,19 @@ operator<<(QDebug &dbg, const Rosegarden::Segment &t)
     return dbg;
 }
 
-QDebug &
-operator<<(QDebug &dbg, const Rosegarden::RealTime &t)
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &dbg, const Rosegarden::RealTime &t)
 {
     dbg << t.toString();
     return dbg;
 }
 
-QDebug &
-operator<<(QDebug &dbg, const Rosegarden::Colour &c)
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &dbg, const Rosegarden::Colour &c)
 {
     dbg << "Colour : rgb = " << c.getRed() << "," << c.getGreen() << "," << c.getBlue();
     return dbg;
 }
 
-QDebug &
-operator<<(QDebug &dbg, const Rosegarden::Guitar::Chord &c)
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &dbg, const Rosegarden::Guitar::Chord &c)
 {
     dbg << "Chord root = " << c.getRoot() << ", ext = '" << c.getExt() << "'";
 
@@ -123,5 +117,4 @@ operator<<(QDebug &dbg, const Rosegarden::Guitar::Chord &c)
     return dbg;
 }
 
-
 }
diff --git a/src/misc/Debug.h b/src/misc/Debug.h
index 07c5e66..7c2ba2e 100644
--- a/src/misc/Debug.h
+++ b/src/misc/Debug.h
@@ -20,6 +20,7 @@
 #include <QTextStream>
 
 #include <string>
+#include <rosegardenprivate_export.h>
 
 namespace Rosegarden {
 
@@ -32,12 +33,12 @@ namespace Guitar {
     class Chord;
 }
 
-QDebug &operator<<(QDebug &, const std::string &);
-QDebug &operator<<(QDebug &, const Rosegarden::Event &);
-QDebug &operator<<(QDebug &, const Rosegarden::Segment &);
-QDebug &operator<<(QDebug &, const Rosegarden::RealTime &);
-QDebug &operator<<(QDebug &, const Rosegarden::Colour &);
-QDebug &operator<<(QDebug &, const Rosegarden::Guitar::Chord &);
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &, const std::string &);
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &, const Rosegarden::Event &);
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &, const Rosegarden::Segment &);
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &, const Rosegarden::RealTime &);
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &, const Rosegarden::Colour &);
+ROSEGARDENPRIVATE_EXPORT QDebug &operator<<(QDebug &, const Rosegarden::Guitar::Chord &);
 
 class RGNoDebug
 {
diff --git a/src/misc/Strings.cpp b/src/misc/Strings.cpp
index c70c7db..34c0136 100644
--- a/src/misc/Strings.cpp
+++ b/src/misc/Strings.cpp
@@ -26,27 +26,27 @@
 namespace Rosegarden
 {
 
-QString strtoqstr(const std::string &str)
+ROSEGARDENPRIVATE_EXPORT QString strtoqstr(const std::string &str)
 {
     return QString::fromUtf8(str.c_str());
 }
 
-QString strtoqstr(const Rosegarden::PropertyName &p)
+ROSEGARDENPRIVATE_EXPORT QString strtoqstr(const Rosegarden::PropertyName &p)
 {
     return QString::fromUtf8(p.c_str());
 }
 
-std::string qstrtostr(const QString &qstr)
+ROSEGARDENPRIVATE_EXPORT std::string qstrtostr(const QString &qstr)
 {
     return std::string(qstr.toUtf8().data());
 }
 
-std::string qStrToStrUtf8(const QString &qstr)
+ROSEGARDENPRIVATE_EXPORT std::string qStrToStrUtf8(const QString &qstr)
 {
     return qstrtostr(qstr);
 }
 
-std::string qStrToStrLocal8(const QString &qstr)
+ROSEGARDENPRIVATE_EXPORT std::string qStrToStrLocal8(const QString &qstr)
 {
     return std::string(qstr.toLocal8Bit().data());
 }
@@ -58,7 +58,7 @@ std::string qStrToStrLocal8(const QString &qstr)
  * things like configuration values from XML files where we want to
  * guarantee the same value is used regardless of surrounding locale.
  */
-double strtodouble(const std::string &s)
+ROSEGARDENPRIVATE_EXPORT double strtodouble(const std::string &s)
 {
     int dp = 0;
     int sign = 1;
@@ -102,13 +102,13 @@ double strtodouble(const std::string &s)
     return result * sign;
 }
 
-double qstrtodouble(const QString &s)
+ROSEGARDENPRIVATE_EXPORT double qstrtodouble(const QString &s)
 {
     return strtodouble(qstrtostr(s));
 }
 
 
-bool qStrToBool(const QString &s)
+ROSEGARDENPRIVATE_EXPORT bool qStrToBool(const QString &s)
 {
     QString tt = s.toLower();
     tt = tt.trimmed();
@@ -118,7 +118,7 @@ bool qStrToBool(const QString &s)
     return false;
 }
 
-bool qStrToBool(const QVariant &v)
+ROSEGARDENPRIVATE_EXPORT bool qStrToBool(const QVariant &v)
 {
     return qStrToBool( v.toString() );
 }
@@ -126,8 +126,7 @@ bool qStrToBool(const QVariant &v)
 
 
 
-std::string
-convertFromCodec(std::string text, QTextCodec *codec)
+ROSEGARDENPRIVATE_EXPORT std::string convertFromCodec(std::string text, QTextCodec *codec)
 {
     if (codec)
         return qstrtostr(codec->toUnicode(text.c_str(), text.length()));
@@ -135,20 +134,17 @@ convertFromCodec(std::string text, QTextCodec *codec)
         return text;
 }
 
-std::ostream &
-operator<<(std::ostream &target, const QString &str)
+ROSEGARDENPRIVATE_EXPORT std::ostream &operator<<(std::ostream &target, const QString &str)
 {
     return target << str.toLocal8Bit().data();
 }
 
-QTextStream &
-operator<<(QTextStream &target, const std::string &str)
+ROSEGARDENPRIVATE_EXPORT QTextStream &operator<<(QTextStream &target, const std::string &str)
 {
     return target << QString(str.c_str());
 }
 
-QStringList
-splitQuotedString(QString s)
+ROSEGARDENPRIVATE_EXPORT QStringList splitQuotedString(QString s)
 {
     QStringList tokens;
     QString tok;
diff --git a/src/misc/Strings.h b/src/misc/Strings.h
index 333fd3e..d7c0fd3 100644
--- a/src/misc/Strings.h
+++ b/src/misc/Strings.h
@@ -28,35 +28,35 @@
 #include "base/PropertyName.h"
 #include "base/Exception.h"
 
+#include <rosegardenprivate_export.h>
+
 class QTextCodec;
 
 namespace Rosegarden
 {
 
-extern QString strtoqstr(const std::string &);
-extern QString strtoqstr(const Rosegarden::PropertyName &);
+extern ROSEGARDENPRIVATE_EXPORT QString strtoqstr(const std::string &);
+extern ROSEGARDENPRIVATE_EXPORT QString strtoqstr(const Rosegarden::PropertyName &);
 
-extern std::string qstrtostr(const QString &);
+extern ROSEGARDENPRIVATE_EXPORT std::string qstrtostr(const QString &);
 
-extern double strtodouble(const std::string &);
-extern double qstrtodouble(const QString &);
+extern ROSEGARDENPRIVATE_EXPORT double strtodouble(const std::string &);
+extern ROSEGARDENPRIVATE_EXPORT double qstrtodouble(const QString &);
 
-extern bool qStrToBool(const QString &s);
-extern bool qStrToBool(const QVariant &v);
+extern ROSEGARDENPRIVATE_EXPORT bool qStrToBool(const QString &s);
+extern ROSEGARDENPRIVATE_EXPORT bool qStrToBool(const QVariant &v);
 
-extern std::string qStrToStrLocal8(const QString &qstr);
-extern std::string qStrToStrUtf8(const QString &qstr);
+extern ROSEGARDENPRIVATE_EXPORT std::string qStrToStrLocal8(const QString &qstr);
+extern ROSEGARDENPRIVATE_EXPORT std::string qStrToStrUtf8(const QString &qstr);
 
-extern std::string convertFromCodec(std::string, QTextCodec *);
+extern ROSEGARDENPRIVATE_EXPORT std::string convertFromCodec(std::string, QTextCodec *);
 
-std::ostream &
-operator<<(std::ostream &, const QString &);
+ROSEGARDENPRIVATE_EXPORT std::ostream &operator<<(std::ostream &, const QString &);
 
-QTextStream &
-operator<<(QTextStream &, const std::string &);
+ROSEGARDENPRIVATE_EXPORT QTextStream &operator<<(QTextStream &, const std::string &);
 
 /// Split a string at whitespace, allowing for quoted substring sections
-extern QStringList splitQuotedString(QString s);
+extern ROSEGARDENPRIVATE_EXPORT QStringList splitQuotedString(QString s);
 
 }
 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index aa2ce24..3bd777a 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-include_directories(../src)
+include_directories(../src ${CMAKE_CURRENT_BINARY_DIR}/../src)
 
 # Code factorization: this macro defines unit tests
 macro(RG_UNIT_TESTS)
------------------------------------------------------------------------------
_______________________________________________
Rosegarden-devel mailing list
[email protected] - use the link below to unsubscribe
https://lists.sourceforge.net/lists/listinfo/rosegarden-devel

Reply via email to