共享库中静态变量的构造方法

时间:2016-03-09 03:36:47

标签: c++ constructor shared-libraries static-variables

我很好奇是否实例化了共享库中实例化的静态变量。 首先,这是代码:

AClass.h

class A {
  public:
    A(int x) { cout << "A constructor called." << endl; }
};

MyLib.cpp

#include "AClass.h"

static A StaticVariableA(50);

因此,使用此代码加上一个 Main.cpp 文件(只有一个空的main函数),我想通过中的变量初始化来调用构造函数MyLib.cpp

我将 MyLib.cpp 编译成共享库,并以多种方式将主程序链接到它,但没有成功。鉴于这两个文件已经编译为目标文件:

(first compiled MyLib.cpp to a shared library)
$ g++ -O0 -fPIC -shared -Wl,-soname,libMyLib.so -o libMyLib.so MyLib.o

(Tried to link the two files)
$ g++ -O0 Main.o -rdynamic libMyLib.so -Wl,-rpath,./
$ g++ -O0 Main.o -L . -Wl,-rpath,./ -lMyLib

直到现在都没有成功,我问你:这可能吗?如果不可能,为什么?如何在共享库中处理静态变量? (我主要对Linux机器感兴趣)

(我知道我不应该使用像这样的共享库。但我只是想知道它做了什么,这不起作用)

奇怪的是,this code有效。将库 GMLOSStFeatEx (使用/src/FeatureExtractor/文件编译的共享库)链接到/tools/Dummy.cpp时。它调用RegisterStaticFeature类型的静态变量的构造函数。

修改

似乎@Pupsik说,它正在优化中。但是,我上面链接的代码没有得到优化。它也没有任何外部代码调用或引用的函数。

this问题中,它建议使用链接标志-no-as-needed,这有效。但是正如下面可以看到的那样,在编译我提到的the code时没有这样的标志。

/usr/bin/c++   -O0 -g -I/usr/local/include  -fPIC -fvisibility-inlines-hidden 
-Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual 
-Wno-missing-field-initializers -pedantic -Wno-long-long 
-Wno-maybe-uninitialized -Wnon-virtual-dtor -Wno-comment -std=c++11 -g
-fno-exceptions -fno-rtti  -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS 
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -L/usr/local/lib     
CMakeFiles/Dummy.dir/DummyMain.cpp.o  -o Dummy -rdynamic ../src
/FeatureExtractor/libGMLOSStFeatEx.so ../src/FeatureExtractor
/libGMLOSDynFeatEx.so ../src/Support/libGMLOSCfgPrinter.so 
-lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info 
-lLLVMMCDisassembler -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen 
-lLLVMScalarOpts -lLLVMProfileData -lLLVMInstCombine -lLLVMInstrumentation 
-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMIRReader -lLLVMAsmParser 
-lLLVMTransformUtils -lLLVMipa -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMTarget 
-lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader 
-lLLVMMC -lLLVMCore -lLLVMSupport -lpapi -lrt -ldl -ltinfo -lpthread -lz -lm 
-Wl,-rpath,/path-to-gmlos/build/src/FeatureExtractor:/path-to-gmlos/build/src/Support

1 个答案:

答案 0 :(得分:0)

所以,事实证明@Pupsik是完全正确的!顺便说一句,谢谢。

正如他所说,图书馆正在优化:

  

也许你的MyLib.cpp已被编译器优化,因为找不到对该库的引用?尝试在MyLib.cpp中添加一些虚拟函数,并从main.cpp中调用它

我引用的github上的代码没有得到优化,因为实际上,main函数调用了该库中的一个函数。

我找到的解决方案是使用链接器标志-as-needed。它无论如何都链接到库,因此不会从二进制文件中删除。

所以,这清除了一切。 再次谢谢。