小试fpc交叉编译:从Linux到Win32

原创 2007年10月05日 21:38:00
刚刚小小的试了下,程序是一个简单的dll外加一个 调用它的exe。(需要装上这个才能编译:fpc-crosswin32_2.0.4-060919_i386.deb)这两段简单的程序如下。

app.pas

 1 program app;
2
3 { app use win32lib.dll }
4
5 procedure SaySomething(str:PChar);stdcall;external 'win32lib' name 'SaySomething';
6 function Add(a,b:Integer):Integer;stdcall;external 'win32lib' name 'Add';
7
8 var
9 a,b:Integer;
10 begin
11 SaySomething('Enter 2 integers:');
12 Readln(a,b);
13 Writeln(a,'+',b,'=',Add(a,b));
14 end.

win32lib.pas

 1 library win32lib;
2
3 { demo library for win32 }
4
5 procedure SaySomething(str:PChar);stdcall;
6 begin
7 Writeln(str);
8 end;
9
10 function Add(a,b:Integer):Integer;stdcall;
11 begin
12 Add:=a+b;
13 end;
14
15 exports
16 SaySomething,
17 Add;
18 begin
19 end.

程序没什么好说的,编译的时候带上-Twin32参数就行了。然而,在成功连接成DLL之后,会出现一个错误。这个错误我个人估计100%是bug。
stlxv@stlxvcomputer:~/samples/freepascal/win32_dll$ fpc -Twin32 win32lib.pas 
Free Pascal Compiler version 2.0.4 [2007/02/02] for i386
Copyright (c) 1993-2006 by Florian Klaempfl
Target OS: Win32 for i386
Compiling win32lib.pas
Linking win32lib.dll
/usr/bin/fpc-i386-win32-dlltool: Unable to open object file:
win32lib.pas(19,1) Error: Error while linking
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
写句出错的话不要紧,要紧的是,整个fpc的返回值不是0。假如在Makefile中,这将导致整个make过程的失败。

对于这个问题,有个仁兄写了个wrapper来解决。也正式这篇文章让我有欲望来写这一篇东西。
 1 { 程序来自:
2 http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=15839
3 这位兄弟同时把fpc-i386-win32-dlltool改名成fpc-i386-win32-dlltool-orig。
4 }

5 program fpc_i386_win32_dlltool;
6 {$mode objfpc}{$H+}
7 uses
8 Classes, SysUtils, Process;
9 var
10 i: integer;
11 s: ansistring;
12 AProcess: TProcess;
13 begin
14 s:=ParamStr(1);
15 For i:=2 to ParamCount() do
16 s:=s + ' ' + ParamStr(i);
17 WriteLn('wrapping: fpc-i386-win32-dlltool ', s);
18 AProcess:=TProcess.Create(nil);
19 AProcess.CommandLine := 'fpc-i386-win32-dlltool-orig '+ s;
20 AProcess.Options := AProcess.Options + [poWaitOnExit];
21 AProcess.Execute;
22 AProcess.Free;
23 end.
好在shell是强大的。所以这个问题可以很容易地解决。所以,最后的Makefile就成这样了-_-!。为了让这个Makefile见得了人,我重新改了一下,汗死...

Makefile

all: win32

.pas.exe:

fpc -o$@ -Twin32 $^

.pas.dll:

fpc -o$@ -Twin32 $^ || exit 0 # 链接成功后会有一个莫名其妙的错误信息(100%是bug!),汗..

win32:
app.exe win32lib.dll
win32lib.dll: win32lib.pas
app.exe: app.pas

clean:

rm -rf *.dll *.exe *.o *.s *.res *./$/$/$

.PHONY:
win32 clean all
.SUFFIXES: .pas .exe .dll

写这篇文章还有一个好处,至少让我用熟了code2html,同时也知道了在pascal方面pas2html和code2html都不怎么好用(看上面的结果就知道了,一部分经过我的再排版)。汗死...



 

Lazarus环境的简单设置

      上回讲到Lazarus已经可以正常的编译程序了,但是IDE的界面不怎么好看,现在我们就来简单的设置一下,以增强显示效果。     1.安装后默认显示的是英文,虽然没什么影响,但是对我们中国...
  • tjCFeng
  • tjCFeng
  • 2008年12月19日 12:36
  • 2472

将 Win32 程序移植到 Linux

对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的。首先声明开发环境。Win32程序的开发环境是VS....
  • sunboy_2050
  • sunboy_2050
  • 2011年03月23日 17:01
  • 6233

在Windows下使用Linux命令 gnuwin32项目的安装与使用

笔者最近需要用处理大量txt文件,这些txt文件都比较大,出于效率考虑想用Windows下面的批处理命令。但是发现用于处理文本文件的sed命令不能用,如图1所示。 因为本人其实是批处理小白,从网上查询...
  • my_learning_road
  • my_learning_road
  • 2017年04月07日 15:56
  • 3269

GNUWin32(Linux下常用工具的Windows版本)

  • 2009年03月24日 16:41
  • 3.07MB
  • 下载

在linux上编译windows 32/64 上运行的vlc

1,GCC版本信息 #gcc -v Using built-in specs. Target: i686-linux-gnu gcc version 4.4.5 (Ubuntu/Linaro 4.4....
  • hui523hui523hui523
  • hui523hui523hui523
  • 2013年01月15日 14:20
  • 5028

Pascal 的春天 -- Freepascal 可开发 WinCE/ARM-Linux程序

今天无意中看到"FPC 2.2.0 以后的版本已经都可以支持WinCE应用程序了。" (2007年的火星新闻),眼球就被吸引过去了,心想:不是吧,Borland 高薪养着的工程师没搞定的事情让一群义工...
  • WSJ741
  • WSJ741
  • 2009年06月02日 18:45
  • 597

小试fpc交叉编译:从Linux到Win32

刚刚小小的试了下,程序是一个简单的dll外加一个 调用它的exe。(需要装上这个才能编译:fpc-crosswin32_2.0.4-060919_i386.deb)这两段简单的程序如下。app.pas...
  • yxf
  • yxf
  • 2007年10月05日 21:38
  • 2117

Windows+cygwin下构造arm-linux交叉编译环境最简单的方法

小I入手刚三天, 还在门口探索, 以下内容还请高手指正 根据网上的资源介绍, 成功的telnet登录到了小I内部, 但是发现shell只有一个ash, 用起来非常的不爽,于是想自己弄个bash用,...
  • chief1985
  • chief1985
  • 2009年05月22日 23:31
  • 21568

FPC的编译宏

FPC的编译宏分为两种,一种是编译条件如IF,一种是编译指令INCLUDE 如下:         AddDirective('I',directive_all, @dir_include);  ...
  • hzg134679hzg
  • hzg134679hzg
  • 2014年08月08日 01:01
  • 566

ubuntu14.04交叉编译vlc2.1.5源码,编译出在win32下运行的程序

要开始编译vlc,首先就是到官网去查找资料,为了满足需求,编译出来在win32下运行,我要修改vlc的plugins下的dll代码 https://wiki.videolan.org/Win32Com...
  • A_sungirl
  • A_sungirl
  • 2015年01月08日 10:42
  • 4648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小试fpc交叉编译:从Linux到Win32
举报原因:
原因补充:

(最多只允许输入30个字)