1

我有以下用于构建我的 Prolog 程序的批处理程序。

set /p VERSION="Enter Version:"
call "c:\Program Files (x86)\SICStus Prolog VC12 4.3.2\bin\sicstus.exe" -l build_program.pl -a %VERSION%

call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat"  
call "C:\Program Files (x86)\SICStus Prolog VC12 4.3.2\bin\spld.exe" --output="fox_optimizer.exe" --static "fox_optimizer.sav"



output="my_program.exe" --static "my_program.sav" --resources=VERSIONINFO.rc

VERSION 变量从用户那里读取,并作为标志发送到 build_program.pl 执行此操作:

:- 
    nl,nl,nl,
    prolog_flag(argv, Arguments),
    Arguments = [VersionNumber|_],
    atom_concat('fox_optimizer_',VersionNumber,FinalFileToCompile),
    nl,
    write('Trying to complile: '),
    write(FinalFileToCompile),
    nl,nl,nl,
    compile(FinalFileToCompile),
    save_program('my_program.sav'),
    halt.

基本上它会构建 .sav 文件,然后 spld 使用该文件来构建 .exe 文件。

我想将元数据添加到构建 .exe 中,我知道 wjen 使用 c++ 你必须添加一个资源文件,所以我尝试了这个..

output="my_program.exe" --static "my_program.sav" --resources=VERSIONINFO.rc

其中 VERSIONINFO.rc 是:

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000904b0"
        BEGIN
            VALUE "CompanyName", "Britannica Knowledge Systems"
            VALUE "FileDescription", "Fox Optimizer"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "fox_optimizer.exe"
            VALUE "LegalCopyright", "Copyright (C) 2016"
            VALUE "OriginalFilename", "fox_optimizer.exe"
            VALUE "ProductName", "Fox Optimizer"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x9, 1200
    END
END

但是在运行 spld 时出现以下错误

cl:命令行警告 D9024:无法识别的源文件类型“VERSIONINFO.rc”,假定为目标文件 VERSIONINFO.rc:致命错误 LNK1136:文件无效或损坏

4

1 回答 1

1

spld选项--resources与 Windows 资源无关。您想要的是将文件编译为.rc文件.res(使用该rc工具)并将该文件与其他目标文件一起传递.res给 C 编译器(通过)。spld类似于以下内容:

call "rc VERSIONINFO.rc"

call "C:\Program Files (x86)\SICStus Prolog VC12 4.3.1\bin\spld.exe" -v --output="my_program.exe" --static "my_program.sav" VERSIONINFO.res

这会将 Windows 资源文件嵌入到由spld.

我添加了-v标志来打开来自spld. 这在故障排除时很有用。

于 2016-05-31T15:09:27.933 回答