У меня нет большого контроля над процессом сборки, но я получаю неопределенную ссылку на ошибку символов, когда мой следующий фрагмент кода пытается связаться с ранее скомпилированной разделяемой библиотекой. [Хотя упомянутые символы есть в так]
Вот фрагмент символов из интересующей общей библиотеки (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
Ваши сообщения об ошибках довольно странные, потому что символы упомянуты (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
, но в этом случае вы, скорее всего, обнаружите, что библиотека одинакова.
Попробуйте перестроить ваше приложение. Я ожидаю, что эти неопределенные ссылки исчезнут, но, вероятно, появятся новые неопределенные ссылки. Повторите процесс, посмотрев, какие классы отсутствуют, и добавив необходимые библиотеки. После нескольких итераций у вас не будет неопределенных ссылок.