I developing some extension on m$ platform with M$VC6.0 ( it's a OpenSSL crypto
capabilities, more advanced than OpenSSL extension providing, when i fill it
ready i will try to publish to PHP site) when core language for internals is a
C++, meaning inside implementation of PHP functions there calls to C++ classes;
may be in future i should actually use PHP object oriented side.
Until than was not much functions it was nice and exciting development , until
number of functions grow to more than 60 and becomes a little hard to maintain
in one file. I tried to do very standard thing , segregate functions by they
functionality to different files , and all seemed to be happy in compilation but
not in linking;
I'm receiving this
php_TPKCS12.obj : LNK2005 error: _delete already defined in cert.obj
php_TPKCS12.obj : warning LNK4006: _delete already defined in cert.obj; second
definition ignored
I searched forums of PHP and around for some examples of somebody stuck with
same problem , but haven't found something similar;
There some references and even explanations how to create PHP extension in C++
but there again considering that all PHP functions are defined and implemented
in one file.
obliviously this is very urgent and not very "hot" issue , but still could
somebody give a look on this .
Not interesting proposition like search for C function named "delete" is not
counting. There is no such thing in PHP code and not in my code
My hint (and after some digging in code, another point to have open source code
for applications) that somewhere in ZEND engine there definition that confusing
compiler/linker that not protected from header file redefinition problems ...
I'm assuming "delete" isn't a function but the C++ operator delete. You're
probably #including the same file more than once, but I doubt it's in Zend.
If all else fails, you can try passing "/FORCE" to the linker options and
it'll try to force the linkage. It might result in a broken binary, though.
J
Igal Ore wrote:
I developing some extension on m$ platform with M$VC6.0 ( it's a OpenSSL
crypto capabilities, more advanced than OpenSSL extension providing, when
i fill it ready i will try to publish to PHP site) when core language for
internals is a C++, meaning inside implementation of PHP functions there
calls to C++ classes; may be in future i should actually use PHP object
oriented side.Until than was not much functions it was nice and exciting development ,
until number of functions grow to more than 60 and becomes a little hard
to maintain in one file. I tried to do very standard thing , segregate
functions by they functionality to different files , and all seemed to be
happy in compilation but not in linking;I'm receiving this
php_TPKCS12.obj : LNK2005 error: _delete already defined in cert.obj
php_TPKCS12.obj : warning LNK4006: _delete already defined in cert.obj;
second definition ignoredI searched forums of PHP and around for some examples of somebody stuck
with same problem , but haven't found something similar;
There some references and even explanations how to create PHP extension in
C++ but there again considering that all PHP functions are defined and
implemented in one file.obliviously this is very urgent and not very "hot" issue , but still could
somebody give a look on this .Not interesting proposition like search for C function named "delete" is
not counting. There is no such thing in PHP code and not in my codeMy hint (and after some digging in code, another point to have open source
code for applications) that somewhere in ZEND engine there definition that
confusing compiler/linker that not protected from header file redefinition
problems ...
This sounds like the "rookie" mistake of declaring your functions inline in
the class definition in the header files, and then including those headers
in multiple files.
eg: foo.h:
class Foo {
Foo() { ... }
~Foo() { ... }
};
foo.cpp:
#include "foo.h"
bar.cpp:
#include "foo.h"
== linker problems.
--Wez.
I'm assuming "delete" isn't a function but the C++ operator delete. You're
probably #including the same file more than once, but I doubt it's in
Zend.If all else fails, you can try passing "/FORCE" to the linker options and
it'll try to force the linkage. It might result in a broken binary,
though.
Igal Ore wrote:I'm receiving this
php_TPKCS12.obj : LNK2005 error: _delete already defined in cert.obj
php_TPKCS12.obj : warning LNK4006: _delete already defined in cert.obj;
second definition ignored
you are right , and for those cases there a preprocessor protection
#ifndef DO_NOT_MAKE_BOBO
#define DO_NOT_MAKE_BOBO
class Foo{
Foo(){...}
~Foo(){...}
};
#endif
isn't it?
Wez Furlong wrote:
This sounds like the "rookie" mistake of declaring your functions inline in
the class definition in the header files, and then including those headers
in multiple files.eg: foo.h:
class Foo {
Foo() { ... }
~Foo() { ... }
};foo.cpp:
#include "foo.h"bar.cpp:
#include "foo.h"== linker problems.
--Wez.
I'm assuming "delete" isn't a function but the C++ operator delete. You're
probably #including the same file more than once, but I doubt it's inZend.
If all else fails, you can try passing "/FORCE" to the linker options and
it'll try to force the linkage. It might result in a broken binary,though.
Igal Ore wrote:
I'm receiving this
php_TPKCS12.obj : LNK2005 error: _delete already defined in cert.obj
php_TPKCS12.obj : warning LNK4006: _delete already defined in cert.obj;
second definition ignored
No, that only prevents the file being included twice in the same .cpp file.
The solution to this problem is to move the function bodies into their own
.cpp file:
foo.h:
class Foo {
Foo();
~Foo();
};
fooclass.cpp:
Foo::Foo() { ... }
Foo::~Foo() { ... }
--Wez.
----- Original Message -----
From: "Igal Ore" iore@cipherquest.com
To: internals@lists.php.net; "Wez Furlong" wez@thebrainroom.com
Cc: jay@php.net; internals@lists.php.net
Sent: Wednesday, September 17, 2003 4:01 PM
Subject: Re: [PHP-DEV] Re: C++ extension question
you are right , and for those cases there a preprocessor protection
#ifndef DO_NOT_MAKE_BOBO
#define DO_NOT_MAKE_BOBOclass Foo{
Foo(){...}
~Foo(){...}
};
#endifisn't it?
Wez Furlong wrote:
This sounds like the "rookie" mistake of declaring your functions inline
in
the class definition in the header files, and then including those
headers
in multiple files.eg: foo.h:
class Foo {
Foo() { ... }
~Foo() { ... }
};foo.cpp:
#include "foo.h"bar.cpp:
#include "foo.h"== linker problems.
--Wez.
yes you right again , but as i suggested , adn thinking that problem is
existin in this scenatrio
cert.cpp (main file with all PHP required defitions and becoming a big
source file; all php includes surrounded by extern "C" {})
php_TPKCS12.cpp have only functions related to PKCS#12 treating
(encypted file storage for end user certificates, private keys and etc.)
meaning in this file there implementation for php functions dealing with p12
And there i have a problem , at least i think.
After brief verification i'm do not use in second file and Classes
associated with problem that you mentioned.
Wez Furlong wrote:
No, that only prevents the file being included twice in the same .cpp file.
The solution to this problem is to move the function bodies into their own
.cpp file:foo.h:
class Foo {
Foo();
~Foo();
};fooclass.cpp:
Foo::Foo() { ... }
Foo::~Foo() { ... }--Wez.
----- Original Message -----
From: "Igal Ore" iore@cipherquest.com
To: internals@lists.php.net; "Wez Furlong" wez@thebrainroom.com
Cc: jay@php.net; internals@lists.php.net
Sent: Wednesday, September 17, 2003 4:01 PM
Subject: Re: [PHP-DEV] Re: C++ extension questionyou are right , and for those cases there a preprocessor protection
#ifndef DO_NOT_MAKE_BOBO
#define DO_NOT_MAKE_BOBOclass Foo{
Foo(){...}
~Foo(){...}
};
#endifisn't it?
Wez Furlong wrote:
This sounds like the "rookie" mistake of declaring your functions inline
in
the class definition in the header files, and then including those
headers
in multiple files.
eg: foo.h:
class Foo {
Foo() { ... }
~Foo() { ... }
};foo.cpp:
#include "foo.h"bar.cpp:
#include "foo.h"== linker problems.
--Wez.