【问题标题】:Remove a symbol from shared object从共享对象中删除符号
【发布时间】:2015-08-07 12:25:30
【问题描述】:

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

这里是来自感兴趣的共享库的符号 sn-p(libmycode.so 下面给出了完整的真实名称),我想删除这个 sn-p 的最后两行并测试删除这些是否有助于我的情况。

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,它与我的代码链接得很好,这两个对象之间的区别是我在 sn-p 中提到的另外两行。

可执行文件的选项和文件

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

【问题讨论】:

  • U 表示符号未定义。看起来您需要将您的可执行文件与openFOAM 库链接。
  • 我将它与相关的 Foam 头文件和共享对象链接起来,这就是为什么我说我无法控制构建过程,如果我在 wmake 中包含正确的库,我已经检查了 10 次(openFoam) 文件。如果我认为存在配置问题,我不会问这个问题。
  • 您也可以使用ldd 来检查您的libmycode.so 是否与openFOAM 正确链接。
  • 你在链接libfiniteVolume吗?你能把你的wmake/fileswmake/options的内容贴在这里吗?
  • @Petr 我已经更新了我的问题,我缺少符号的库是 libpffFGMbasicThermophysicalModels

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


【解决方案1】:

您的错误消息很奇怪,因为在standard OpenFOAM 中提到的符号(Foam::fluidThermo::fluidThermo(Foam::Time const&, Foam::word const&) 等)do not exist,也没有在我知道的其他分支中(12)。同时,类名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

-lfluidThermophysicalModels \

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

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

【讨论】:

  • 我对其进行了修改,以 Time & 而不是 fvMesh& 作为参数。
  • 然后检查我的解决方案并确保您重建了libfluidThermophysicalModels
  • 我有修改过的OpenFOAM,我已经修改了chem1dToFoam.C类来实际调用修改后的libpdfFGMbasicThermophysicalmodel.so
  • 我会看看我是否真的在构建 libfluidThermophysicalModels
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多