共享库

时间:2015-12-20 13:38:15

标签: c++ linux shared-libraries clang static-libraries

考虑以下设置,其中包含两个使用静态库的共享库:

static.cpp

#include "static.h"
static int a = 0;
int getA()
{
    return a++;
}

static.h

#pragma once
int getA();

shareda.cpp

#include <iostream>
#include "shareda.h"
#include "static.h"
void printA()
{
    std::cout << getA() << std::endl;
}

shareda.h

#pragma once
void printA();

sharedb.cpp

#include <iostream>
#include "sharedb.h"
#include "static.h"
void printB()
{
    std::cout << getA() << std::endl;
}

sharedb.h

#pragma once
void printB();

的main.cpp

#include "shareda.h"
#include "sharedb.h"
int main()
{
    printA();
    printA();
    printB();
    printA();
    printB();
    return 0;
}

我使用以下命令编译和运行这些文件(使用Clang 3.8.0,从源代码编译,使用64位Debian和GNU ld 2.25):

clang++ -c static.cpp -o static.o -fPIC
ar rcs libstatic.a static.o
clang++ -c shareda.cpp -o shareda.o -fPIC
clang++ -shared -o libshareda.so shareda.o libstatic.a
clang++ -c sharedb.cpp -o sharedb.o -fPIC
clang++ -shared -o libsharedb.so sharedb.o libstatic.a
clang++  -L. -lshareda -lsharedb -o main main.cpp
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main

令我惊讶的是,输出结果如下:

0
1
2
3
4

我的期望是:

0
1
0
2
1

显然,尽管static.cpp中static前面有a个关键字,但只存在a的一个实例。有没有办法让两个a实例,每个共享库一个?

0 个答案:

没有答案