我喜欢我的库加倍作为可执行文件。期望的行为是:
$ ./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
答案 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