我有两个Free Pascal单元,我想在linux上使用C程序。
以下是我的工作:
$ 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
如果我将process.o和process.ppu添加到ppumove完成的链接过程,则会解决此VMT_PROCESS_TPROCESS相关错误。然而,在这样做之后,另一个单位失踪了,之后另一个单位......你得到它。
有没有办法以某种方式将所有必要的单元链接在一个.so文件中,以便C程序可以正确地dlopen()库?
答案 0 :(得分: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。
虽然我建议只使用最新的2.6.0,而不是一些5岁的2.2.2
可能需要首先使用PIC重新编译FPC。