我很好奇是否实例化了共享库中实例化的静态变量。 首先,这是代码:
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
答案 0 :(得分:0)
所以,事实证明@Pupsik是完全正确的!顺便说一句,谢谢。
正如他所说,图书馆正在优化:
也许你的MyLib.cpp已被编译器优化,因为找不到对该库的引用?尝试在MyLib.cpp中添加一些虚拟函数,并从main.cpp中调用它
我引用的github上的代码没有得到优化,因为实际上,main函数调用了该库中的一个函数。
我找到的解决方案是使用链接器标志-as-needed
。它无论如何都链接到库,因此不会从二进制文件中删除。
所以,这清除了一切。 再次谢谢。