25
Environment: linux x64, compiler gcc 4.x
Project has following structure:
static library "slib"
-- inside this library, there is static object "sobj"
dynamic library "dlib"
-- links statically "slib"
executable "exe":
-- links "slib" statically
-- links "dlib" dynamically
at end of the program, "sobj" is destructed twice. That behaviour is expected, BUT it is destructed twice at same memory address, i.e. same "this" in destructor - as the result there is double destruction problem. I think it is due some symbol overlapping.
What the solution for that conflict? Maybe some linking option?
Here is test case:
main_exe.cpp
#include <cstdlib>
#include "static_lib.h"
#include "dynamic_lib.h"
int main(int argc, char *argv[])
{
stat_useStatic();
din_useStatic();
return EXIT_SUCCESS;
}
static_lib.h
#ifndef STATIC_LIB_H
#define STATIC_LIB_H
#include <cstdio>
void stat_useStatic();
struct CTest
{
CTest(): status(isAlive)
{
printf("CTest() this=%d\n",this);
}
~CTest()
{
printf("~CTest() this=%d, %s\n",this,status==isAlive?"is Alive":"is Dead");
status=isDead;
}
void use()
{
printf("use\n");
}
static const int isAlive=12385423;
static const int isDead=6543421;
int status;
static CTest test;
};
#endif
static_lib.cpp
#include "static_lib.h"
CTest CTest::test;
void stat_useStatic()
{
CTest::test.use();
}
dynamic_lib.h
#ifndef DYNAMIC_LIB_H
#define DYNAMIC_LIB_H
#include "static_lib.h"
#ifdef WIN32
#define DLLExport __declspec(dllexport)
#else
#define DLLExport
#endif
DLLExport void din_useStatic();
#endif
dynamic_lib.cpp
#include "dynamic_lib.h"
DLLExport void din_useStatic()
{
CTest::test.use();
}