gpt4 book ai didi

c++ - 使用 Free Pascal 时,针对 Linux x64 下的 indigo cheminformatics 包的静态链接提示对 __dso_handle 的 undefined reference

转载 作者:行者123 更新时间:2023-11-30 04:04:39 26 4
gpt4 key购买 nike

更新 1

根据 this SO post , 当 libstdc++.so.6.X 用作 C++ 库时,Free Pascal 可能 不链接 C++ 目标文件,这意味着静态 C++ 库。

应该注意的是,对于该 SO 帖子中的特定 hello-world 程序,Free Pascal 可以使用 libstdc++.so.5 作为 C++ 库链接到 C++ 目标文件。备注libstdc++.so.5 is with GCC 3.3.X .

更新2

根据Free Pascal future plans , 与 C++ 代码的链接 直到下一个主要版本完成。

更新3

根据 "How to use C code in Free Pascal projects" , Free Pascal 不能直接链接到 C++ 对象中。它们应该放在共享库中以便从 Free Pasacal 使用。


the indigo cheminformatics package的源代码可以编译成静态库,并为其 C++ 核心提供纯 C API 接口(interface)。

流程如下:

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

针对静态 indigo 库编译 .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

针对静态 indigo 库编译 .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 的 undefined reference ”。错误消息如下所示:

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)

你能帮忙评论一下原因和解决方法吗?

最佳答案

我认为在您的引用资料中,您主要混淆了“pascal 调用 C++ 类”和“链接到同一项目的 pascal 和 C++ 库”。更新 1 是关于后者的,更新 2 是关于前者的,更新 3 是旧的,我猜并没有真正相关。

我的猜测是修改后的 FPC 启动代码通过 CTOR 和 DTOR 初始化库,只初始化共享库,而不是静态库。 IOW 任何链接到主二进制文件的 C/C++ 状态都可能不会被初始化。

这可能需要对 CTOR 和 DTOR 的内部工作有准确的理解,特别是结合静态链接来解决这个问题。

明确一点:主干中的“C++”支持(下一个 FPC 版本将基于此)是关于直接调用 (gcc) C++ 类。 IOW 让 FPC 理解 gcc mangling(在 some gcc version 中,因为 C++ mangling 通常长期依赖于版本)。虽然它在分支中,但尚不清楚它是否会在下一个修复分支中被视为完成和稳定。

关于c++ - 使用 Free Pascal 时,针对 Linux x64 下的 indigo cheminformatics 包的静态链接提示对 __dso_handle 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23647522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com