[CMake] Best Practice to determine what type of libraries I am linking to

Mike Jackson mike.jackson at imts.us
Thu Jul 10 18:03:54 EDT 2008


Funny, that is what I ended up doing with all my support libraries. I  
create a #define in the configured header and then I do a try-compile  
to look for the symbol. If the symbol is there then I know it is a  
dynamic library.

For those interested (or for comments) here is the CMake code that I  
use:

IF (EXPAT_FOUND)
   INCLUDE(CheckSymbolExists)
   #############################################
   # Find out if EXPAT was build using dll's
   #############################################
   # Save required variable
   SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
   SET(CMAKE_REQUIRED_FLAGS_SAVE    ${CMAKE_REQUIRED_FLAGS})
   # Add EXPAT_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES
   SET(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES};$ 
{EXPAT_INCLUDE_DIRS}")

   CHECK_SYMBOL_EXISTS(EXPAT_BUILT_AS_DYNAMIC_LIB "expat_config.h"  
HAVE_EXPAT_DLL)

     IF (HAVE_EXPAT_DLL STREQUAL "TRUE")
         SET (HAVE_EXPAT_DLL "1")
     ENDIF (HAVE_EXPAT_DLL STREQUAL "TRUE")

   # Restore CMAKE_REQUIRED_INCLUDES and CMAKE_REQUIRED_FLAGS variables
   SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
   SET(CMAKE_REQUIRED_FLAGS    ${CMAKE_REQUIRED_FLAGS_SAVE})
   #
   #############################################

ENDIF (EXPAT_FOUND)


-- 
Mike Jackson   Senior Research Engineer
Innovative Management & Technology Services


On Jul 10, 2008, at 5:55 PM, James Bigler wrote:

> You are correct that you can't simply test the HDF5_LIBRARIES
> variables since in windows a .lib is used for both static and shared
> linking.
>
> Since you can get access to this information from a header file you
> could do a try compile and look at the output, or you could read the
> contents of the file into a variable and parse out the define with a
> regular expression.  See file(READ filename variable [LIMIT numBytes]
> [OFFSET offset] [HEX]) and string(REGEX MATCH <regular_expression>
> <output variable> <input> [<input>...]).
>
> James
>
> On Fri, Jun 27, 2008 at 8:16 AM, Mike Jackson  
> <mike.jackson at imts.us> wrote:
>> What are the recommended ways to determine what type of libraries my
>> application is linking against. An example should explain what I  
>> mean.
>>
>> I use the HDF5 library as part of my project. It can be built  
>> either as a
>> static or dynamic. If it is built as a static library then I don't  
>> need to
>> copy it during the install phase. If it is built as a dynamic  
>> library then I
>> _do_ need to copy it.
>>
>> Would parsing the HDF5_LIBRARIES variable for a .lib or .dll work?  
>> Although
>> not sure about that since you link against the .lib on windows but  
>> use the
>> .dll? This is mainly for Visual Studio use.
>>
>> Currently there is a #define HDF5_DLL_LIB defined in the  
>> H5config.h file. I
>> thought of trying a simple try-compile a test file to see if it would
>> compile and then base my decision on that.
>>
>> Other ways? Better ways? Example code?
>>
>> Thanks
>> --
>> Mike Jackson   Senior Research Engineer
>> Innovative Management & Technology Services
>>
>>
>>
>> _______________________________________________
>> CMake mailing list
>> CMake at cmake.org
>> http://www.cmake.org/mailman/listinfo/cmake
>>
> _______________________________________________
> CMake mailing list
> CMake at cmake.org
> http://www.cmake.org/mailman/listinfo/cmake
>




More information about the CMake mailing list