Hello, I try to compile an example of FFI to C++ under windows.
1) vc2008.bat was copyed to Gambit's root 2) Modifyed one line in vc2008.bat. At the end of "set COMP_GEN=cl -nologo ....." added -D___ENABLE_CPLUSPLUS 3) The bat file executed and finished w/o any issues. 4) Then gsc.exe gsi.exe and gsc-cc-o.bat were copyed to ~/bin folder
My previously tested example of cpp-ffi (wich works fine under linux and mac) I am compiling with BAT file. Compilation finished with:
cube-test_.obj : error LNK2001: unresolved external symbol _____20_cube_2d_test cube-test_.obj : error LNK2019: unresolved external symbol "int __cdecl ___main_char(int,char * * const,union ___mod_or_ lnk_union * (__cdecl*)(struct ___global_state_struct *),char *)" (?___main_char@@YAHHQAPADP6APAT___mod_or_lnk_union@@PAU ___global_state_struct@@@ZPAD@Z) referenced in function _main cube-test.exe : fatal error LNK1120: 2 unresolved externals
Whay am I doing wrong?
Content of the source files below. There is also Makefile wich was used at the unix environments, and make.bat file witch I am using in this case.
--- Valery
==== SOURCE FILES =====
make.bat ------------------------------------------- del cube-test.exe del cube-test.c del cube.o del cube-test_.c
setlocal @call "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
set GAMBCDIR=....\Package set GAMBCDIR_LIB=%GAMBCDIR%\lib set GAMBCDIR_INCLUDE=%GAMBCDIR%\include
set COMP_GEN=cl -nologo -Oityb1 -Zi -GS -RTC1 -MT -D_CRT_SECURE_NO_DEPRECATE -c -I%GAMBCDIR_INCLUE% -D___ENABLE_CPLUSPLUS -D___SYS_TYPE_CPU="i686" -D___SYS_TYPE_VENDOR="pc" -D___SYS_TYPE_OS="visualc"
if not "%1%" == "" ( set COMP_GEN=%COMP_GEN% -D___GAMBCDIR="%1%" )
set COMP_LIB_MH=%COMP_GEN% -D___LIBRARY set COMP_LIB_PR_MH=%COMP_LIB_MH% -D___PRIMAL set COMP_LIB=%COMP_LIB_MH% -D___SINGLE_HOST set COMP_LIB_PR=%COMP_LIB_PR_MH% -D___SINGLE_HOST set COMP_APP=%COMP_GEN% -D___SINGLE_HOST
gsc -c cube-test.scm gsc -link cube-test.c ren cube-test_.c cube-test_.cpp
%COMP_APP% cube.cpp %COMP_APP% cube-test_.cpp
cl -Fecube-test.exe %GAMBCDIR_LIB%\libgambc.lib cube-test_.obj cube.obj Kernel32.Lib User32.Lib Gdi32.Lib WS2_32.Lib
cube.h ------------------------------------------- #ifndef CUBE_HH #define CUBE_HH
class Cube { public: Cube(); ~Cube(); void setSide(double s); double getSide(); double Area(); double Volume(); void Properties(); private: double Side; }; #endif
cube.cpp ------------------------------------------- #include <iostream> #include "cube.h"
Cube::Cube() { } Cube::~Cube() { } void Cube::setSide(double s) { Side = s <= 0 ? 1 : s; } double Cube::getSide() { return Side; } double Cube::Area() { return 6 * Side * Side; } double Cube::Volume() { return Side * Side * Side; } void Cube::Properties() { std::cout << "Characteristics of this cube"; std::cout << "\nSide = " << getSide(); std::cout << "\nArea = " << Area(); std::cout << "\nVolume = " << Volume() << "\n\n"; }
cube-test.scm ------------------------------------------- ;;; Gambit should be compiled with --enable-cplusplus flag
(c-declare "#include "cube.h"")
(define cube-new (c-lambda () (pointer "Cube") "___result_voidstar = (void *)(new Cube());"))
(define cube-set-side (c-lambda ((pointer "Cube") double) void "___arg1->setSide(___arg2);"))
(define cube-get-side (c-lambda ((pointer "Cube")) double "___arg1->getSide();"))
(define cube-properties (c-lambda ((pointer "Cube")) void "___arg1->Properties();"))
(display "C++ test\n") (define c (cube-new)) (cube-set-side c 10.2) (display (cube-get-side c)) (print "\n") (cube-properties c)
Makefile ------------------------------------------- cube-test: cube-test.c cube.o gsc -link cube-test.c gcc -o cube-test cube.o -x c++ cube-test.c cube-test_.c -lm -ldl -lgambc -lstdc++ -lutil -I/usr/local/Gambit-C/include -L/usr/local/Gambit-C/lib
cube.o: cube.cpp cube.h gcc -c cube.cpp
cube-test.c: cube-test.scm rm -f cube-test.c gsc -c -o cube-test.c cube-test.scm
clean: rm -f cube-test cube-test.c cube.o cube-test_.c
Afficher les réponses par date