Удалить символ из общего объекта

У меня нет большого контроля над процессом сборки, но я получаю неопределенную ссылку на ошибку символов, когда мой следующий фрагмент кода пытается связаться с ранее скомпилированной разделяемой библиотекой. [Хотя упомянутые символы есть в так]

Вот фрагмент символов из интересующей общей библиотеки (libmycode.so ниже приведено полное настоящее имя), я хочу удалить последние две строки этого фрагмента и проверить, помогает ли их удаление в моем случае.

U _ZN4Foam5token21transferCompoundTokenERKNS_7IstreamE
U _ZN4Foam5token8compound10isCompoundERKNS_4wordE
U _ZN4Foam5tokenC1ERNS_7IstreamE
U _ZN4Foam6fvMeshC1ERKNS_8IOobjectE
U _ZN4Foam6fvMeshD1Ev

Я повторяю, я не могу просто скомпилировать их, используя g ++ -unresolved-symbols -fdata-section -ffunction-section.

Также

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

0

Решение

Ваши сообщения об ошибках довольно странные, потому что символы упомянуты (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 классы. Следовательно, вам нужно сделать ссылку на библиотеку, которая содержит код для этих классов.

Чтобы выяснить, какая это библиотека, во-первых, найдите расположение источников для basicThermo в источниках OpenFOAM. Вы найдете файл basicThermo.C в src/thermophysicalModels/basic/basicThermo/.

Теперь пройдитесь по структуре каталогов, пока не окажетесь в каталоге, который имеет Make подкаталог в нем: это будет означать, что вы достигли корня библиотеки, в которую basicThermo принадлежит. Вы найдете, что это src/thermophysicalModels/basic/. Там, в Make/files, вы увидите следующую строку:

LIB = $(FOAM_LIBBIN)/libfluidThermophysicalModels

Это означает, что basicThermo класс скомпилирован в эту библиотеку и вам нужно добавить эту библиотеку в список библиотек, на которые вы ссылаетесь. Таким образом, добавьте следующую строку в ваш wmake/options:

-lfluidThermophysicalModels \

Повторите процесс с fluidThermo, но в этом случае вы, скорее всего, обнаружите, что библиотека одинакова.

Попробуйте перестроить ваше приложение. Я ожидаю, что эти неопределенные ссылки исчезнут, но, вероятно, появятся новые неопределенные ссылки. Повторите процесс, посмотрев, какие классы отсутствуют, и добавив необходимые библиотеки. После нескольких итераций у вас не будет неопределенных ссылок.

1

Другие решения


По вопросам рекламы [email protected]