0

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

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

我怎样才能:

  • 编译scriptedmain.pscriptedmain二进制文件?
  • 阻止test.p运行/部分中scriptedmain.p的代码?beginend

脚本main.p:

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 时fpc scriptedmain.p,没有创建可执行文件,因为 Pascal 检测到它是一个单元。但我希望它是除了库之外的可执行文件。

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

测试.p:

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

当我用 编译 test.p 时fpc test.p,生成的可执行文件结合了两个begin/end声明(不是所需的行为)。

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

2 回答 2

0

感谢 Free Pascal邮件列表中的 Ager 和 Zhirov ,我能够用最少的 hack 构建一个有效的脚本主示例。还张贴在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

脚本main.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.

测试通过:

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
于 2011-10-14T22:14:19.887 回答
0

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

于 2011-10-13T20:40:54.087 回答