Статическое связывание с пакетом индиго-хеминформатики в Linux x64 жалуется на неопределенную ссылку на __dso_handle при использовании Free Pascal

Обновление 1

В соответствии с этот ТАК пост, Свободный Паскаль может не ссылаться на объектный файл C ++, что означает статические библиотеки C ++, когда libstdc ++. so.6.X используется в качестве C ++ lib.

Следует отметить, что для этой конкретной программы hello-world в этой статье SO Free Pascal может ссылаться на объектный файл C ++, используя libstdc ++. So.5 в качестве C ++ lib. Заметка libstdc ++. so.5 с GCC 3.3.X.

Обновление 2

Согласно Свободные планы на будущее Паскаля, Связывание с кодом C ++ не до следующей основной версии.

Обновление 3

В соответствии с «Как использовать C-код в проектах Free Pascal», Free Pascal не может напрямую ссылаться на объекты C ++. Они должны быть помещены в общую библиотеку для использования из Free Pasacal.


Исходный код пакет индиго-хеминформатики может быть скомпилирован в статические библиотеки и предоставляет интерфейс API на простом C для своего ядра C ++.

Процедура показана:

cd indigo
module add gcc/4.7.2 # or gcc/4.3.2
module add cmake/2.8.8
python ./build_scripts/indigo-release-libs.py --preset=linux64

Часть древовидной структуры показана:

indigo
./dist/indigo-libs-1.1.12-linux64-static.zip
./dist/LICENSE.GPL
./dist/indigo-inchi.h
./dist/indigo-renderer.h
./dist/indigo.h
./dist/static
./dist/static/Linux
./dist/static/Linux/x64
./dist/static/Linux/x64/libcairo.a
./dist/static/Linux/x64/libcommon.a
./dist/static/Linux/x64/libgraph.a
./dist/static/Linux/x64/libinchi.a
./dist/static/Linux/x64/libindigo-inchi-static.a
./dist/static/Linux/x64/libindigo-renderer-static.a
./dist/static/Linux/x64/libindigo-static.a
./dist/static/Linux/x64/liblayout.a
./dist/static/Linux/x64/libmolecule.a
./dist/static/Linux/x64/libpixman.a
./dist/static/Linux/x64/libpng.a
./dist/static/Linux/x64/libreaction.a
./dist/static/Linux/x64/librender2d.a
./dist/static/Linux/x64/libtinyxml.a
./dist/static/Linux/x64/libz.a

Чтобы скомпилировать .c и статическую ссылку на статические библиотеки индиго:

Исходный код примера файла cTest.c показан:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "indigo.h"
int main (void) { printf("%s\n", indigoVersion()); }

, процедура показана:

cd indigo/dist/static/Linux/x64
module add gcc/4.7.2 # or gcc/4.3.2
g++ -I../../../ cTest.c -o cTest libindigo-static.a libreaction.a liblayout.a libmolecule.a libgraph.a libcommon.a libz.a libtinyxml.a -lpthread

Чтобы скомпилировать .pp и статическую ссылку на статические библиотеки индиго:

Исходный код примера файла fpcTest.pp показан:

program fpcTest;

{$MODE DELPHI}
{$APPTYPE CONSOLE}

uses
SysUtils;

// {$linklib stdc++}
{$link /usr/lib64/libstdc++.so.6}
{$linklib pthread}
{$linklib libindigo-static}
{$linklib libreaction}
{$linklib liblayout}
{$linklib libmolecule}
{$linklib libgraph}
{$linklib libcommon}
{$linklib libz}
{$linklib libtinyxml}

function indigoVersion (): PChar; cdecl; external 'libindigo-static';

begin
WriteLn(indigoVersion);
end.

, процедура показана:

cd indigo/dist/static/Linux/x64
~/fpc-2.6.4/bin/fpc  fpc_static.pp

Тем не менее, он жалуется на «неопределенную ссылку на __dso_handle». Сообщение об ошибке показано ниже:

Free Pascal Compiler version 2.6.4 [2014/03/03] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling fpc_static.pp
fpc_static.pp(4,2) Note: APPTYPE is not supported by the target OS
Linking fpc_static
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
./libindigo-static.a(option_manager.cpp.o): In function `_GLOBAL__sub_I_option_manager.cpp':
option_manager.cpp:(.text.startup+0x3): undefined reference to `__dso_handle'
./libindigo-static.a(indigo.cpp.o): In function `Indigo::init()':
indigo.cpp:(.text+0x3bf): undefined reference to `__dso_handle'
./libindigo-static.a(indigo.cpp.o): In function `_GLOBAL__sub_I_indigo.cpp':
indigo.cpp:(.text.startup+0x2e): undefined reference to `__dso_handle'
indigo.cpp:(.text.startup+0x5b): undefined reference to `__dso_handle'
./libcommon.a(profiling.cpp.o): In function `_GLOBAL__sub_I_profiling.cpp':
profiling.cpp:(.text.startup+0x22): undefined reference to `__dso_handle'
./libcommon.a(profiling.cpp.o):profiling.cpp:(.text.startup+0x40): more undefined references to `__dso_handle' follow
fpc_static.pp(25,1) Error: Error while linking
fpc_static.pp(25,1) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: ~/fpc-2.6.4/bin/ppcx64 returned an error exitcode (normal if you did not specify a source file to be compiled)

Не могли бы вы помочь прокомментировать причину и обходной путь?

1

Решение

Я думаю, что в ваших ссылках вы в основном путаете «Паскаль, вызывающий классы C ++» и «Паскаль и библиотеки C ++, связанные в одном проекте». обновление 1 — о последнем, обновление 2 — о первом, обновление 3 — старое и не очень связанное, я думаю.

Я предполагаю, что модифицированный код запуска FPC, который инициализирует библиотеки через CTOR и DTOR, ТОЛЬКО инициализирует общие библиотеки, а не статические библиотеки. IOW любое состояние C / C ++, связанное с основным двоичным файлом, может не инициализироваться.

Вероятно, для этого потребуется точное понимание внутренней работы CTOR и DTOR, особенно в сочетании со статической связью.

Чтобы было понятно: поддержка C ++ в транке (на которой будет основана следующая версия FPC) вызывающие (gcc) классы C ++ непосредственно. IOW, заставляющий FPC понимать НКУ калечащий (в какая-то версия gcc, поскольку C ++ искажение обычно зависит от версии в долгосрочной перспективе). И хотя он находится в ветке, пока неизвестно, будет ли он считаться завершенным и стабильным в следующей ветке исправлений.

2

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