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
