如何使用spld SICStus将版本信息添加到build .exe文件

时间:2016-05-31 06:47:13

标签: cmd compilation linker sicstus-prolog

我有以下批处理程序用于构建我的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.

besically它构建.sav文件,然后由spld用于构建.exe文件。

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

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:文件无效或损坏

1 个答案:

答案 0 :(得分:1)

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

spld

这会将Windows资源文件嵌入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 创建的可执行文件中。

我添加了spld标志,以便从-v打开一些详细的调试信息。这在排除故障时很有用。