在静态库(obj 文件)之间共享 class 的实例

Instance of class shared between static libraries (obj files)

我有一个包含以下 3 个文件的 C++ 应用程序:

// 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!");
}

是否可以从 main.cpp 中删除 sample1 对象的实例化并让它已经可用(来自静态库 "sample.obj")?

如果我将该行移动到 sample.h,那么我在编译期间遇到的错误是:

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

如果我将该行移至 sample.cpp,则错误消息为:

'sample1': undeclared identifier

其实我明白为什么会出现这两个错误,只是不知道如何解决。

谢谢

Specify an extern storage class in the header file:

namespace mynamespace {

    // ...

    extern sample sample1;
}

然后在sample.cpp中正常定义:

mynamespace::sample sample1;

在某些 compilers/operating 系统上,可能需要指定其他内容,特定于编译器的内容,以便获得与库中数据符号的外部链接。这超出了 C++ 标准的范围。有关详细信息,请参阅编译器的文档。

使用静态声明:

在sample.h

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

然后在 sample.cpp

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

来自 main.cpp 访问变量

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