从共享对象中删除一个符号

我对构建过程没有太多的控制权,但是当我的下一段代码试图链接到先前编译的共享库时,我得到了对符号错误的未定义引用。 [虽然所说的符号在那里]

这里是共享感兴趣的库(libmycode.so下面给出了完整的真实姓名)的符号片段,我想删除此代码段的最后两行,并测试如果删除这些帮助我的情况。

U _ZN4Foam5token21transferCompoundTokenERKNS_7IstreamE
U _ZN4Foam5token8compound10isCompoundERKNS_4wordE
U _ZN4Foam5tokenC1ERNS_7IstreamE
U _ZN4Foam6fvMeshC1ERKNS_8IOobjectE
U _ZN4Foam6fvMeshD1Ev

我再说一遍,我不能用g ++ -unresolved-symbols -fdata-sections -ffunction-sections来编译它们。

objcopy -N 'Foam::fvMesh()' libmycode.so

没有工作

另外我还有另外一个libmycode2.so,它和我的代码很好的链接,这两个对象之间的区别在于我在代码片段中提到的另外两行。

可执行文件的选项和文件

chem1dReader.C
chem1dToFoam.C

EXE = $(FOAM_USER_APPBIN)/pasrChem1dToFoam_m

现在选项

EXE_INC =  
-I$(LIB_SRC)/OpenFOAM/lnInclude 
-I$(LIB_SRC)/finiteVolume/lnInclude 
-I$(LIB_SRC)/turbulenceModels 
-I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel/lnInclude 
-I$(LIB_SRC)/turbulenceModels/compressible/RAS/lnInclude 
-I$(LIB_SRC)/turbulenceModels/compressible/LES/lnInclude 
-I$(LIB_SRC)/turbulenceModels/LES/LESdeltas/lnInclude 
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude 
-I$(LIB_pasrFGM_m_SRC)/pdfFGMThermo/basic/lnInclude 
-I$(LIB_pasrFGM_m_SRC)/pdfFGMThermo/reactionThermo/lnInclude 
-I$(LIB_pasrFGM_m_SRC)/combustionModels/lnInclude

EXE_LIBS = 
-L$(FOAM_USER_LIBBIN) 
-lODE 
-lspecie 
-lcompressibleLESModels 
-lcompressibleTurbulenceModel 
-lcompressibleRASModels 
-lpdfFGMbasicThermophysicalModels 
-lpdfFGMreactionThermophysicalModels 
-lpdfFGMCombustionModels 
-lfiniteVolume

当我尝试编译pasrChem1dToFoam_m时出现确切的错误消息

dReader.o Make/linux64GccDPOpt/chem1dToFoam.o -L/home/vasu/OpenFOAM/OpenFOAM-2.3.1/platforms/linux64GccDPOpt/lib 
 -L/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib -lODE   -lspecie -lcompressibleLESModels -lcompressibleTurbulenceModel - lcompressibleRASModels -lpdfFGMbasicThermophysicalModels - lpdfFGMreactionThermophysicalModels -lpdfFGMCombustionModels -  lfiniteVolume -lOpenFOAM -ldl   -lm -o 

/home/vasu/OpenFOAM/vasu-  2.3.1/platforms/linux64GccDPOpt/bin/pasrChem1dToFoam_m
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::fluidThermo::destroyTimeConstructorTables()'
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::basicThermo::constructTimeConstructorTables()'
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::basicThermo::destroyTimeConstructorTables()'
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::fluidThermo::fluidThermo(Foam::Time const&, Foam::word const&)'
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::fluidThermo::constructTimeConstructorTables()'
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::basicThermo::TimeConstructorTablePtr_'
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/lib/libpdfFGMbasicThermophysicalModels.so: undefined reference to `Foam::fluidThermo::TimeConstructorTablePtr_'
 collect2: error: ld returned 1 exit status
/home/vasu/OpenFOAM/OpenFOAM-2.3.1/wmake/Makefile:149: recipe for target '
/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/bin/pasrChem1dToFoam_m' failed
make: *** [/home/vasu/OpenFOAM/vasu-2.3.1/platforms/linux64GccDPOpt/bin/pasrChem1dToFoam_m] Error 1

你的错误信息很奇怪,因为所提到的符号( Foam::fluidThermo::fluidThermo(Foam::Time const&, Foam::word const&)等)不存在于标准的OpenFOAM中,也不存在于我知道的其他分支中(1,2)。 同时,类名称Foam::fluidThermobasicThermo是标准的OpenFOAM类。

这很可能意味着库libpdfFGMbasicThermophysicalModels.so是为高度修改的OpenFOAM版本开发的。 在这种情况下,您将无法将其与标准OpenFOAM进行链接。 但是,如果您确实拥有修改后的OpenFOAM,那么您只是没有链接所需的库。

在接下来的内容中,我会解释一下,如果您确实拥有所需的OpenFOAM版本,我将如何找到这些库。 我将在标准的OpenFOAM上解释它。 您可能需要在版本中重复以检查库名称是否有所不同。

您会发现未定义的引用来自fluidThermobasicThermo类。 因此,您需要链接到包含这些类的代码的库。

要找到它是哪个库,首先在OpenFOAM源代码中找到basicThermo的来源的位置。 您将在src/thermophysicalModels/basic/basicThermo/找到文件basicThermo.C

现在直接找到目录结构,直到找到Make子目录中的一个目录:这将意味着您已经到达了basicThermo所属的库的根目录。 你会发现它是src/thermophysicalModels/basic/ 。 在Make/files ,你会看到下面这行:

LIB = $(FOAM_LIBBIN)/libfluidThermophysicalModels

这意味着basicThermo类被编译到该库中,并且需要将该库添加到链接到的库的列表中。 因此, wmake/options添加到您的wmake/options

-lfluidThermophysicalModels 

fluidThermo重复这个过程,但是对于这种情况,你很可能会发现库是相同的。

尝试重建您的应用程序。 我期望这些未定义的引用会去,但可能会出现新的未定义引用。 通过查看哪些类丢失并添加所需的库来重复该过程。 经过几次迭代后,您将不会有未定义的参考。

链接地址: http://www.djcxy.com/p/42617.html

上一篇: Remove a symbol from shared object

下一篇: Copying symbols from static object into shared object