help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Dynamic calling of C++ functions in Octave-2.1.39


From: Paul Kienzle
Subject: Re: Dynamic calling of C++ functions in Octave-2.1.39
Date: Fri, 6 Dec 2002 11:15:27 -0500
User-agent: Mutt/1.2.5.1i

On Thu, Dec 05, 2002 at 10:11:19PM -0500, Andy Adler wrote:
> Ravish wrote:
> > Now i want to call some C++ functions which i have written using MS Visual
> > C++ as my IDE
> 
> Here is a recipe using the MSVC++ comand line tools:
> Summary: create a dll from the MSVC++. Export the functions
> you need as "C" (ie. no name mangling). Link to this dll
> from octave.
> 
> SAMPLE FILES:
> -------- d_gcc.cc -------------
> #include <octave/oct.h>
> extern "C" {
> int msgbox_plus_one( const char * text );
> }
> DEFUN_DLD (d_gcc,args, , "usage d_gcc('string')" ) {
>    octave_value_list retval;
>    retval(0) = (double) msgbox_plus_one( args(0).string_value().c_str() );
>    return retval;
> }
> 
> -------- d_vcc.cpp ------------
> #include <windows.h>
> extern "C" {
>   BOOL WINAPI DllMain( HINSTANCE, DWORD, LPVOID ) { return 1;}
> 
>   int __declspec(dllexport)
>   msgbox_plus_one( const char * text ){
>       return MessageBox( NULL, text, "TITLE",
>             MB_ABORTRETRYIGNORE | MB_SETFOREGROUND) + 1;
>   }
> }
> ---------------
> Proceedure:
> 
> 1. Compile d_vcc with MSVC++ (or using your IDE)
> $ cl -nologo -LD d_vcc.cpp user32.lib
> d_vcc.cpp
>    Creating library d_vcc.lib and object d_vcc.exp
> 
> Note that only the *dll file is useful here.
> 
> Unfortunately, mkoctfile doesn't recognize *dll files
> automatically, so you have to do the work yourself.
> 
> 2. First to mkoctfile -v to get the commands
> $ mkoctfile -v d_gcc.cc
> g++ -c -I/usr/include/octave-2.1.40 -I/usr/include/octave-2.1.40/octave
> -I/usr/include -mieee-fp -g -O2 -Wall d_gcc.cc -o d_gcc.o
> g++ -shared -Wl,--export-all-symbols -Wl,--enable-auto-import -o d_gcc.oct
> d_gcc.o -L/usr/lib/octave-2.1.40 -loctave.dll -lcruft.dll -loctinterp.dll
> d_gcc.o(.text+0x39d): In function `_Z6Fd_gccRK17octave_value_listi':
> /usr/include/c++/3.2/bits/basic_string.h:125: undefined reference to
> `_msgbox_plus_one'
> 
> 3. Now, copy the last line and add your *dll name
> $ g++ -shared -Wl,--export-all-symbols -Wl,--enable-auto-import -o
> d_gcc.oct d_gcc.o -L/usr/lib/octave-2.1.40 -loctave.dll -lcruft.dll
> -loctinterp.dll d_vcc.dll
> 
> $ ls -l
> total 2687
> -rwxr-xr-x    1 adler    None       882396 Dec  5 21:29 d_gcc.oct
> -rwxr-xr-x    1 adler    None        28672 Dec  5 21:22 d_vcc.dll
> 
> $ strip *.dll *.oct
> $ ls -l
> -rwxr-xr-x    1 adler    None       242176 Dec  5 21:30 d_gcc.oct
> -rwxr-xr-x    1 adler    None        20992 Dec  5 21:30 d_vcc.dll
> 
> Note that one of the frustrating things with dld functions with
> cygwin octave is that they are *much* bigger than comparative
> linux ones.
> 
> 4. Now open octave and run d_gcc and what the MessageBox popup.
> 
> Notes:
>  - Try to avoid doing tricky things in DllMain
>  - Use extern "C"
>  - You can't include both <windows.h> and <octave/oct.h> as
>     they have major namespace fights.
> 
> Comment:
>   I would like to propose a patch to mkoctfile which would allow
> arguments to be passed directly to the linker. Is there a standard
> switch for compilers that implies this function?

maybe you could do something like the following:

   LFLAGS="`mkoctfile -P LFLAGS` d_vcc.dll" mkoctfile -v d_gcc.cc


> 
> 
> Andy
> --
> Andy Adler,
> Assistant Professor, School of Information Technology and Engineering,
> University of Ottawa, Tel:1(613)562-5800 X 2345, Email:address@hidden
> 
> 
> 
> 
> 
> -------------------------------------------------------------
> Octave is freely available under the terms of the GNU GPL.
> 
> Octave's home on the web:  http://www.octave.org
> How to fund new projects:  http://www.octave.org/funding.html
> Subscription information:  http://www.octave.org/archive.html
> -------------------------------------------------------------
> 



-------------------------------------------------------------
Octave is freely available under the terms of the GNU GPL.

Octave's home on the web:  http://www.octave.org
How to fund new projects:  http://www.octave.org/funding.html
Subscription information:  http://www.octave.org/archive.html
-------------------------------------------------------------



reply via email to

[Prev in Thread] Current Thread [Next in Thread]