从共享对象中删除符号

时间:2015-08-07 12:25:30

标签: c++ linker shared-libraries symbols openfoam

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

这里是感兴趣的共享库中的一个符号片段(libmycode.so下面给出了完整的真实姓名),我想删除这个片段的最后两行并测试是否删除它们有助于我的情况。

AsyncSubject

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

另外

U _ZN4Foam5token21transferCompoundTokenERKNS_7IstreamE
U _ZN4Foam5token8compound10isCompoundERKNS_4wordE
U _ZN4Foam5tokenC1ERNS_7IstreamE
U _ZN4Foam6fvMeshC1ERKNS_8IOobjectE
U _ZN4Foam6fvMeshD1Ev

无效

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

可执行文件的选项和文件

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

现在选项

chem1dReader.C
chem1dToFoam.C

EXE = $(FOAM_USER_APPBIN)/pasrChem1dToFoam_m

当我尝试编译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

1 个答案:

答案 0 :(得分:1)

您的错误消息很奇怪,因为do not exist中提到的符号(Foam::fluidThermo::fluidThermo(Foam::Time const&, Foam::word const&)等)standard OpenFOAM,以及我所知道的其他叉子(12)。同时,类名Foam::fluidThermobasicThermo是标准的OpenFOAM类。

这很可能意味着库libpdfFGMbasicThermophysicalModels.so是为高度修改的OpenFOAM版本开发的。在这种情况下,您将无法将其与标准OpenFOAM链接。但是,如果您实际上已经修改了OpenFOAM,那么您就不会链接所需的库。

在下文中,我将解释我将如何找到这些库,假设您实际上拥有所需的OpenFOAM版本。我将在标准OpenFOAM上解释它。您可能需要在版本中重复它以检查库名称是否不同。

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

要查找它所在的库,首先要在OpenFOAM源中找到basicThermo的源位置。您会在basicThermo.C中找到文件src/thermophysicalModels/basic/basicThermo/

现在走到目录结构,直到你发现自己在一个目录中有Make子目录:这意味着你到达了basicThermo所属的库的根目录。你会发现它是src/thermophysicalModels/basic/。在Make/files中,您会看到以下行:

LIB = $(FOAM_LIBBIN)/libfluidThermophysicalModels

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

-lfluidThermophysicalModels \

使用fluidThermo重复此过程,但对于这种情况,您很可能会发现该库是相同的。

尝试重建您的应用程序。我希望这些未定义的引用会出现,但可能会出现新的未定义引用。通过查看缺少的类并添加所需的库来重复此过程。经过几次迭代后,您将没有未定义的引用。