从共享对象中删除一个符号
我对构建过程没有太多的控制权,但是当我的下一段代码试图链接到先前编译的共享库时,我得到了对符号错误的未定义引用。 [虽然所说的符号在那里]
这里是共享感兴趣的库(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::fluidThermo
和basicThermo
是标准的OpenFOAM类。
这很可能意味着库libpdfFGMbasicThermophysicalModels.so
是为高度修改的OpenFOAM版本开发的。 在这种情况下,您将无法将其与标准OpenFOAM进行链接。 但是,如果您确实拥有修改后的OpenFOAM,那么您只是没有链接所需的库。
在接下来的内容中,我会解释一下,如果您确实拥有所需的OpenFOAM版本,我将如何找到这些库。 我将在标准的OpenFOAM上解释它。 您可能需要在版本中重复以检查库名称是否有所不同。
您会发现未定义的引用来自fluidThermo
和basicThermo
类。 因此,您需要链接到包含这些类的代码的库。
要找到它是哪个库,首先在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