Pascal单元可以编译为可执行文件吗?

时间:2011-10-13 19:52:03

标签: pascal main fpc scriptedmain

我喜欢我的库加倍作为可执行文件。期望的行为是:

$ ./scriptedmain
Main: The meaning of life is: 42
$ ./test
Test: The meaning of life is: 42

我怎么能:

  • 获取scriptedmain.p以编译成scriptedmain二进制文件?
  • 阻止test.p运行scriptedmain.p的{​​{1}} / begin部分中的代码?

scriptedmain.p:

end

当我用unit ScriptedMain; interface function MeaningOfLife () : integer; implementation function MeaningOfLife () : integer; begin MeaningOfLife := 42 end; begin write('Main: The meaning of life is: '); writeln(MeaningOfLife()) end. 编译scriptedmain.p时,没有创建可执行文件,因为Pascal检测到它是一个单元。但我希望它除了库之外还是一个可执行文件。

fpc scriptedmain.p

test.p:

$ ./scriptedmain
-bash: ./scriptedmain: No such file or directory

当我使用program Test; uses ScriptedMain; begin write('Test: The meaning of life is: '); writeln(MeaningOfLife()) end. 编译test.p时,生成的可执行文件会合并两个fpc test.p / begin声明(不是所需的行为)。

end

2 个答案:

答案 0 :(得分:0)

我不知道您正在使用什么样的Pascal,但有些变体支持使用{$IFC condition} ... {$ENDC}进行条件编译。您也许可以将它与编译时结合使用,以包含/排除在给定版本中您需要或不需要的代码。

答案 1 :(得分:0)

感谢Agra和Zhirov在Free Pascal mailing list中,我能够以最少的黑客构建一个有效的脚本主要示例。也发布在RosettaCode

生成文件:

all: scriptedmain

scriptedmain: scriptedmain.pas
    fpc -dscriptedmain scriptedmain.pas

test: test.pas scriptedmain
    fpc test.pas

clean:
    -rm test
    -rm scriptedmain
    -rm *.o
    -rm *.ppu

scriptedmain.pas:

{$IFDEF scriptedmain}
program ScriptedMain;
{$ELSE}
unit ScriptedMain;
interface
function MeaningOfLife () : integer;
implementation
{$ENDIF}
    function MeaningOfLife () : integer;
    begin
        MeaningOfLife := 42
    end;
{$IFDEF scriptedmain}
begin
    write('Main: The meaning of life is: ');
    writeln(MeaningOfLife())
{$ENDIF}
end.

test.pas:

program Test;
uses
    ScriptedMain;
begin
    write('Test: The meaning of life is: ');
    writeln(MeaningOfLife())
end.

示例:

$ make
$ ./scriptedmain 
Main: The meaning of life is: 42
$ make test
$ ./test 
Test: The meaning of life is: 42