On Thu, Jul 29, 2010 at 9:52 PM, Benoit Scherrer
<[email protected]>wrote:

>
>
> On Thu, Jul 29, 2010 at 9:14 PM, Steven G. Johnson 
> <[email protected]>wrote:
>
>> Thanks for looking into this, Benoit!  Does this build a static library
>> (.lib) or a shared library (.dll), or both?
>>
>>
> Thanks! that's true currently it is only for a static library. It could be
> good to also have the option to compile
> as a shared library with CMake, i will do that.
>
>
>
>
>> On Jul 29, 2010, at 8:27 PM, Be-noix wrote:
>>
>>> - rename #include "config.h" to #include "config_nlopt.h"
>>> because my project already had a config.h (bad idea)
>>>
>>
>> This doesn't make sense to me.  Surely you are compiling NLopt as a
>> library?  In which case the config.h file is internal to NLopt and is
>> irrelevant to programs using NLopt.  Programs using NLopt need only include
>> the nlopt.h header and link the NLopt library.
>>
>
>
> That's true that for the nlopt library itself there is no problem.
> But in my project i was including both api/nlopt.h and util/nlopt-util.h
> (to use the function nlopt_seconds)
> This nlopt-util.h file includes config.h, and there were some conflicts.
>
>
>
>>  because VC was in 'C' mode, and not 'C++', and you can define a
>>> variable only at the beginning of a block in C
>>>
>>
>> Actually, mixed declarations and code have been been a standard part of C
>> for 11 years now.  But I generally try to stick with 1989 C anyway, and I
>> will fix the two instances you spotted in the next NLopt release.
>>
>> (With these two fixes, it now compiles with gcc -std=c89 -pedantic.)
>>
>>  (I tried for one hour to force VC to use C++ but without any success)
>>>
>>
>> If NLopt is not compiling as C++, I'd be interested to hear what the
>> problems are.  I can compile with "g++ -pedantic -ansi" without problems.
>>
>
>
> No no it's definitely compiling as C++, what i said was not clear. The
> thing is that in VS (if i don't make a mistake)
> all files with .c are compiled as C, and cxx/cpp as C++. By renaming
> optimize.c to optimize.cxx there is no more
> 'block' error. Another option: in the VS interface i could select the file
> optimize.c and manually set the flag /TP to force its
> compilation in C++ and there wouldn't be the 'block' error. I tried to set
> that flag /TP in the CMakeLists.txt
> but it didn't worked.
>
> That's strange because VS is generally really less stringent than gcc about
> the norms, and so here it seems it sticks
> as you said to the 1989 C and not gcc.
>
>
>>
>>  And success!
>>> Maybe Steven you could include these modifs in the original source code?
>>> (and if you want to CMakeList.txt ?)
>>>
>>
>> I'd be happy to post the CMakeList.txt on the web site, although I'd
>> prefer not to change the name of the config.h header file as explained
>> above.
>>
>
>  sure. But what do you think about my problem with nlopt-util? Is the
> include of config.h really necessary in that
> file?
>
>
>>  Steven
>>
>> PS. I notice that the C99/IEEE function copysign is missing on Windows so
>> you defined a macro, although apparently Microsoft defined a _copysign
>> function because they love to be different.  I'll include a check for this
>> in the next release.
>>
>
> yes that's true. In fact i did have a linker warning about _copysign (but
> not a compiler warning, so VS knew
> what was that function). And i didn't tried to look in which lib
> in _copysign , i just made the macro.
>
> Benoit
>
> --
> / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
> / /
> Benoit Scherrer
> Postdoctoral Research Fellow
> Computational Radiology Laboratory,
> Harvard Medical School (Boston)
>
> http://www.crl.med.harvard.edu/
> http://www.BenoitScherrer.com
> / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
> / /
>


Here is a CMakeLists.txt with an option to choose between static or shared

Also, i didn't found any dllexport in the original source code.

So for win32, in nlopt.h, i modified it to be:

#if defined(NLOPT_DLL) && (defined(_WIN32) || defined(__WIN32__))
/* annoying Windows syntax for calling functions in a DLL */

    #ifdef NLOPT_EXPORT
 #define NLOPT_EXTERN(T) __declspec(dllexport) T NLOPT_STDCALL
#else
#define NLOPT_EXTERN(T) extern __declspec(dllimport) T NLOPT_STDCALL
 #endif

#else
(...)

With such a code and with the CMakeLists.txt, when the option 'Compile as
shared' is selected,
then both NLOPT_DLL and NLOPT_EXPORT  are defined and __declspec(dllexport)
is used

If the user want to import the nlopt.dll, he sets only NLOPT_DLL in his
project  and __declspec(dllimport)
is used.

I checked it seems to compile (it does create a dll).
didn't tried the shared option on linux yet....

Benoit

Benoit


#==============================================================================
# NLOPT CMake file
#
# NLopt is a free/open-source library for nonlinear optimization, providing
# a common interface for a number of different free optimization routines
# available online as well as original implementations of various other
# algorithms
# WEBSITE: http://ab-initio.mit.edu/wiki/index.php/NLopt
# AUTHOR: Steven G. Johnson
#
# This CMakeLists.txt file was created to compile NLOPT with the CMAKE
utility.
# Benoit Scherrer, 2010 CRL, Harvard Medical School
# Copyright (c) 2008-2009 Children's Hospital Boston
# Minor changes to the source was applied to make possible the compilation
with
# Cmake under Linux/Win32
#==============================================================================


CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
INCLUDE(CheckIncludeFiles)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckTypeSize)


#==============================================================================
# COMPILATION CHECKINGS and CONFIGURATION GENERATION
#==============================================================================
CHECK_INCLUDE_FILES( unistd.h HAVE_UNISTD_H)
CHECK_INCLUDE_FILES( string.h HAVE_STRING_H)
CHECK_INCLUDE_FILES( strings.h HAVE_STRINGS_H)
CHECK_INCLUDE_FILES( sys/stat.h HAVE_SYS_STAT_H)
CHECK_INCLUDE_FILES( inttypes.h HAVE_INTTYPES_H)
CHECK_INCLUDE_FILES( memory.h HAVE_MEMORY_H)
CHECK_INCLUDE_FILES( stdlib.h HAVE_STDLIB_H)
CHECK_INCLUDE_FILES( stdint.h HAVE_STDINT_H)

CHECK_INCLUDE_FILES( sys/types.h HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILES( sys/types.h HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILES( sys/types.h HAVE_SYS_TYPES_H)

CHECK_FUNCTION_EXISTS( isinf HAVE_ISINF)
CHECK_FUNCTION_EXISTS( isinf HAVE_ISNAN)
CHECK_FUNCTION_EXISTS( gettimeofday HAVE_GETTIMEOFDAY)
CHECK_FUNCTION_EXISTS( qsort_r HAVE_QSORT_R)
CHECK_FUNCTION_EXISTS( time HAVE_TIME)

CHECK_TYPE_SIZE(uint32_t    UINT32_T)
IF(NOT HAVE_UINT32_T)
  IF(MSVC)
    SET(uint32_t "unsigned int")
    SET(SIZEOF_UNSIGNED_INT 4)
  ENDIF(MSVC)
ENDIF(NOT HAVE_UINT32_T)

SET( NLOPT_MAJOR_VERSION 2 )
SET( NLOPT_MINOR_VERSION 2 )

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.h.in${PROJECT_BINARY_DIR}/config_nlopt.h
IMMEDIATE )


#==============================================================================
# INCLUDE DIRECTORIES
#==============================================================================
INCLUDE_DIRECTORIES (
${CMAKE_CURRENT_SOURCE_DIR}
        ${PROJECT_BINARY_DIR}
stogo
util
direct
 cdirect
praxis
luksan
 crs
mlsl
mma
 cobyla
newuoa
neldermead
 auglag
bobyqa
isres
 slsqp
api   )


#==============================================================================
# nlopt LIBRARY TARGET (SHARED OR STATIC)
#==============================================================================

SET ( NLOPT_SOURCES
direct/DIRect.c direct/direct_wrap.c direct/DIRserial.c direct/DIRsubrout.c
direct/direct-internal.h direct/direct.h
 cdirect/cdirect.c cdirect/hybrid.c cdirect/cdirect.h
praxis/praxis.c praxis/praxis.h
 luksan/plis.c luksan/plip.c luksan/pnet.c luksan/mssubs.c luksan/pssubs.c
luksan/luksan.h
crs/crs.c crs/crs.h
 mlsl/mlsl.c mlsl/mlsl.h
mma/mma.c mma/mma.h
cobyla/cobyla.c cobyla/cobyla.h
 newuoa/newuoa.c newuoa/newuoa.h
neldermead/nldrmd.c neldermead/neldermead.h neldermead/sbplx.c
 auglag/auglag.c auglag/auglag.h
bobyqa/bobyqa.c bobyqa/bobyqa.h
isres/isres.c isres/isres.h
 slsqp/slsqp.c slsqp/slsqp.h
api/general.c api/options.c api/optimize.c api/deprecated.c
api/nlopt-internal.h api/nlopt.h api/f77api.c api/f77funcs.h api/f77funcs_.h
api/nlopt.hpp api/nlopt-in.hpp
 util/mt19937ar.c util/sobolseq.c util/soboldata.h util/timer.c util/stop.c
util/nlopt-util.h util/redblack.c util/redblack.h util/qsort_r.c
util/rescale.c
 stogo/global.cc stogo/linalg.cc stogo/local.cc stogo/stogo.cc
stogo/tools.cc stogo/global.h stogo/linalg.h stogo/local.h
stogo/stogo_config.h stogo/stogo.h stogo/tools.h
        )

OPTION(NLOPT_BUILD_SHARED "Build NLOPT as a shared library" OFF )

IF(NLOPT_BUILD_SHARED)
  ADD_DEFINITIONS(-DNLOPT_DLL -DNLOPT_EXPORT)
  ADD_LIBRARY (nlopt SHARED ${NLOPT_SOURCES} )
ELSE(NLOPT_BUILD_SHARED)
  ADD_LIBRARY (nlopt STATIC ${NLOPT_SOURCES} )
ENDIF(NLOPT_BUILD_SHARED)
_______________________________________________
NLopt-discuss mailing list
[email protected]
http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss

Reply via email to