3

Linux の C プログラムから使用したい Free Pascal ユニットが 2 つあります。

これが私がすることです:

$ fpc -fPIC base64.pas queueutils.pas
Warning: Only one source file supported
Free Pascal Compiler version 2.2.2 [2008/11/05] for x86_64
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling queueutils.pas
queueutils.pas(2088,11) Warning: Symbol "Socket" is deprecated
queueutils.pas(2097,10) Warning: Symbol "Connect" is deprecated
queueutils.pas(2104,3) Warning: Symbol "Sock2Text" is deprecated
2432 lines compiled, 0.5 sec
4 warning(s) issued

$ ppumove -o queueutils -e ppl *.ppu
PPU-Mover Version 2.1.1
Copyright (c) 1998-2007 by the Free Pascal Development Team

Processing base64.ppu... Done.
Processing queueutils.ppu... Done.
Linking queueutils.o base64.o
Done.

libqueueutils.so が作成されます。

$ file libqueueutils.so
libqueueutils.so: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped

$ ldd libqueueutils.so
ldd: warning: you do not have execution permission for `./libqueueutils.so'
        statically linked

ただし、C プログラムがこの方法でライブラリを使用しようとすると、次のようになります。

libqueue = dlopen("./libqueueutils.so", RTLD_LAZY);
if (!libqueue) {
  fprintf (stderr, "%s\n", dlerror());
}

エラーメッセージが表示されます:

$ ./tmbrkr
./libqueueutils.so: undefined symbol: VMT_PROCESS_TPROCESS

この VMT_PROCESS_TPROCESS 関連のエラーは、ppumove によるリンク処理に process.o と process.ppu を追加すると解決します。しかし、そうすると別のユニットが欠落し、その後別のユニットが欠落しています...わかりました。

Cプログラムがライブラリを適切にdlopen()できるように、必要なすべてのユニットを1つの.soファイルにリンクする方法はありますか?

4

1 に答える 1

2

通常のバイナリ(exe)が「プログラム」ソースファイルからのものであるのと同じように、.so/dllは「ライブラリ」ソースファイルから作成されます。

残りはモデルは同じです。ライブラリのメインプログラムをビルドするだけで、コンパイラは必要なすべてのユニットを収集し、それらを.soに詰め込みます。

exportsキーワードを使用すると、エクスポートするシンボルを定義できます。

library testdll;

uses x,y,z;

// define exportable symbols here

// some examples of symbol exports
exports
   P1 index 1,  // dll based on index
   P2 name 'Proc2', // normal export with alternate external symbol
   P3,               // just straight export.
   P4 resident    // for some MCU use
   ;

begin
  // startup code
end.

また、マニュアルで$ soname$libsuffixと$libprefixを調べてください。

5年前の2.2.2ではなく、最新の2.6.0を使用することをお勧めします。

ただし、最初にPICを使用してFPCを再コンパイルする必要がある場合があります。

于 2012-11-27T10:03:03.310 に答える