diff --git a/CMakeLists.txt b/CMakeLists.txt index ff79980..6751684 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,13 @@ if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() +# If compiler support symbol visibility, enable it. +include(CheckCCompilerFlag) +check_c_compiler_flag(-fvisibility=hidden HAS_VISIBILITY) +if (HAS_VISIBILITY) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") +endif() + find_package(Boost COMPONENTS system thread REQUIRED) if(MSVC OR MSVC90 OR MSVC10) diff --git a/include/console_bridge/console.h b/include/console_bridge/console.h index 43209e4..83776e5 100644 --- a/include/console_bridge/console.h +++ b/include/console_bridge/console.h @@ -39,6 +39,8 @@ #include +#include "exportdecl.h" + /** \file console.h \defgroup logging Logging Macros \{ @@ -76,7 +78,7 @@ namespace console_bridge { /** \brief The set of priorities for message logging */ -enum LogLevel +enum CONSOLE_BRIDGE_DLLAPI LogLevel { CONSOLE_BRIDGE_LOG_DEBUG = 0, CONSOLE_BRIDGE_LOG_INFO, @@ -92,7 +94,7 @@ enum LogLevel ways, an implementation of this class needs to be provided. This instance can be set with the useOutputHandler function. */ -class OutputHandler +class CONSOLE_BRIDGE_DLLAPI OutputHandler { public: @@ -111,7 +113,7 @@ class OutputHandler /** \brief Default implementation of OutputHandler. This sends the information to the console. */ -class OutputHandlerSTD : public OutputHandler +class CONSOLE_BRIDGE_DLLAPI OutputHandlerSTD : public OutputHandler { public: @@ -124,7 +126,7 @@ class OutputHandlerSTD : public OutputHandler }; /** \brief Implementation of OutputHandler that saves messages in a file. */ -class OutputHandlerFile : public OutputHandler +class CONSOLE_BRIDGE_DLLAPI OutputHandlerFile : public OutputHandler { public: @@ -143,29 +145,29 @@ class OutputHandlerFile : public OutputHandler }; /** \brief This function instructs ompl that no messages should be outputted. Equivalent to useOutputHandler(NULL) */ -void noOutputHandler(void); +CONSOLE_BRIDGE_DLLAPI void noOutputHandler(void); /** \brief Restore the output handler that was previously in use (if any) */ -void restorePreviousOutputHandler(void); +CONSOLE_BRIDGE_DLLAPI void restorePreviousOutputHandler(void); /** \brief Specify the instance of the OutputHandler to use. By default, this is OutputHandlerSTD */ -void useOutputHandler(OutputHandler *oh); +CONSOLE_BRIDGE_DLLAPI void useOutputHandler(OutputHandler *oh); /** \brief Get the instance of the OutputHandler currently used. This is NULL in case there is no output handler. */ -OutputHandler* getOutputHandler(void); +CONSOLE_BRIDGE_DLLAPI OutputHandler* getOutputHandler(void); /** \brief Set the minimum level of logging data to output. Messages with lower logging levels will not be recorded. */ -void setLogLevel(LogLevel level); +CONSOLE_BRIDGE_DLLAPI void setLogLevel(LogLevel level); /** \brief Retrieve the current level of logging data. Messages with lower logging levels will not be recorded. */ -LogLevel getLogLevel(void); +CONSOLE_BRIDGE_DLLAPI LogLevel getLogLevel(void); /** \brief Root level logging function. This should not be invoked directly, but rather used via a \ref logging "logging macro". Formats the message string given the arguments and forwards the string to the output handler */ -void log(const char *file, int line, LogLevel level, const char* m, ...); +CONSOLE_BRIDGE_DLLAPI void log(const char *file, int line, LogLevel level, const char* m, ...); } diff --git a/include/console_bridge/exportdecl.h b/include/console_bridge/exportdecl.h new file mode 100644 index 0000000..594b8cc --- /dev/null +++ b/include/console_bridge/exportdecl.h @@ -0,0 +1,84 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +/* Author: Thomas Moulard */ + +#ifndef CONSOLE_BRIDGE_EXPORTDECL_H +# define CONSOLE_BRIDGE_EXPORTDECL_H + +// Handle portable symbol export. +// Defining manually which symbol should be exported is required +// under Windows whether MinGW or MSVC is used. +// +// The headers then have to be able to work in two different modes: +// - dllexport when one is building the library, +// - dllimport for clients using the library. +// +// On Linux, set the visibility accordingly. If C++ symbol visibility +// is handled by the compiler, see: http://gcc.gnu.org/wiki/Visibility +# if defined _WIN32 || defined __CYGWIN__ +// On Microsoft Windows, use dllimport and dllexport to tag symbols. +# define CONSOLE_BRIDGE_DLLIMPORT __declspec(dllimport) +# define CONSOLE_BRIDGE_DLLEXPORT __declspec(dllexport) +# define CONSOLE_BRIDGE_DLLLOCAL +# else +// On Linux, for GCC >= 4, tag symbols using GCC extension. +# if __GNUC__ >= 4 +# define CONSOLE_BRIDGE_DLLIMPORT __attribute__ ((visibility("default"))) +# define CONSOLE_BRIDGE_DLLEXPORT __attribute__ ((visibility("default"))) +# define CONSOLE_BRIDGE_DLLLOCAL __attribute__ ((visibility("hidden"))) +# else +// Otherwise (GCC < 4 or another compiler is used), export everything. +# define CONSOLE_BRIDGE_DLLIMPORT +# define CONSOLE_BRIDGE_DLLEXPORT +# define CONSOLE_BRIDGE_DLLLOCAL +# endif // __GNUC__ >= 4 +# endif // defined _WIN32 || defined __CYGWIN__ + +# ifdef CONSOLE_BRIDGE_STATIC +// If one is using the library statically, get rid of +// extra information. +# define CONSOLE_BRIDGE_DLLAPI +# define CONSOLE_BRIDGE_LOCAL +# else +// Depending on whether one is building or using the +// library define DLLAPI to import or export. +# ifdef console_bridge_EXPORTS +# define CONSOLE_BRIDGE_DLLAPI CONSOLE_BRIDGE_DLLEXPORT +# else +# define CONSOLE_BRIDGE_DLLAPI CONSOLE_BRIDGE_DLLIMPORT +# endif // CONSOLE_BRIDGE_EXPORTS +# define CONSOLE_BRIDGE_LOCAL CONSOLE_BRIDGE_DLLLOCAL +# endif // CONSOLE_BRIDGE_STATIC +#endif //! CONSOLE_BRIDGE_EXPORTDECL_H