简体   繁体   中英

Instance of class shared between static libraries (obj files)

I have a C++ application with the following 3 files:

// sample.h
#ifndef sample_h
#define sample_h
#include <stdio.h>
namespace mynamespace {
    class sample {
        public:
            void myprintf(const char* tmp);
    };
}
#endif

// sample.cpp
#include "sample.h"
void mynamespace::sample::myprintf(const char* val) {
    printf(val);
}

// main.cpp
#include "sample.h"
int main() {
    mynamespace::sample sample1; // How to omit this line?
    sample1.myprintf("Hello world!");
}

Is it possible to remove the instantiation of sample1 object from main.cpp, and to have it already available (coming from the static library "sample.obj")?

If I move that line to sample.h, then the error I get during compilation is:

"class mynamespace::sample sample1" already defined in sample.obj

If I move that line to sample.cpp, then the error message is:

'sample1': undeclared identifier

Actually I understand why both errors occur, I just don't know what is the solution.

Thanks

Use static declaration:

in sample.h

namespace mynamespace{
class sample {
public:
    static sample sample1;
    void myprintf(const char* tmp);
};
static sample& sample1 = sample::sample1;
}

then in sample.cpp

mynamespace::sample mynamespace::sample::sample1;

from main.cpp access the variable

mynamespace::sample::sample1.myprintf("");
mynamespace::sample1.myprintf("");

Specify an extern storage class in the header file :

namespace mynamespace {

    // ...

    extern sample sample1;
}

And then define it normally in sample.cpp :

mynamespace::sample sample1;

It's possible that on some compilers/operating systems it will be necessary to specify something else, something that's compiler-specific, in order to get external linkage to a data symbol in a library. This is beyond the scope of the C++ standard. Consult your compiler's documentation for more information.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM