Я прошу прощения заранее, прежде чем задавать глупые вопросы,
но я искал в Интернете в моих силах, но не нашел никакого ответа, который работает в моем случае.
Мой вопрос:
Как я могу избавиться от смущающего * .manifest.exe связано с *.EXE,
когда коды, скомпилированные с MS Visual Studio 2008 из bakefile сгенерированный make-файл?
Сначала я создал бекфайл следующим образом:
<?xml version="1.0" ?> <!-- =========================================== Plain EXE =========================================== --> <makefile><!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> <!-- HERE OUR PROJECT GOES --> <exe id="MyApplication"> <app-type> console </app-type> <!-- Compiler Specific --> <cflags>/TC /W4 /Za </cflags> <!-- Compile code as C. /TP , as C++ /Tc <source file> means this file is C only, /Tp means this file is C++ only. /O1 minimize space, /O2 maximize speed, /Os favor code space, /Ot favor code speed. /Wall enable all warnings (gives warning on own headers like stdio.h). /Wp64 enable 64 bit porting warnings (will be deprecated in future). /Za disable extensions, can be used with plain console apps but not with gui apps. --> <!-- <define>SOMEMACRO</define> --> <!-- <define>_OPENGLUT_STATIC</define> --> <!-- use underscore '_' before macro --> <!-- <include>../include/foo</include> --> <!-- <include>C:\xtralibs\appu</include> --> <!-- <include>C:\xtralibs\OpenGLUT-0.6.3vc</include> --> <!-- <headers>utils.h additionalheader.h</headers> --> <sys-lib> user32.lib kernel32.lib shell32.lib gdi32.lib comctl32.lib ole32.lib winmm </sys-lib> <!-- OpenGLUT_static.lib OpenGLUT.lib glu32.lib opengl32.lib --> <!-- <sys-lib>png</sys-lib> --> <!-- <sys-lib>OpenGLUT</sys-lib> --> <!-- <sys-lib>z</sys-lib> --> <!-- <lib-path>/usr/lib/mysql</lib-path> --> <!-- <lib-path>C:\xtralibs\OpenGLUT-0.6.3vc</lib-path> --> <!-- note that hardcoding library paths like this is a bad idea, it's done here only for the sake of simplicity; in real bakefile, an <option> would be used --> <!--<library>mylib</library> --> <ldflags> /ENTRY:"mainCRTStartup"</ldflags> <!-- required for gui apps only, >can be used with console apps also --> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> <!-- ~~~~~~~~ Compiler Specific definition Ends ~~~~~~~~~~ --> <!-- COMMON --> <!-- <win32-res> resource.rc </win32-res> --> <sources> test.c </sources> </exe> <!-- HERE OUR PROJECT ENDS --> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> </makefile>
Затем я создал командный файл как:
bakefile -f msvc -o Makefile.mak testing.bkl
вызвать «% programfiles% \ Microsoft Visual Studio 9.0 \ VC \ vcvarsall.bat»
nmake -f Makefile.mak
CMD
После этого Makefile был создан как:
# ========================================================================= # This makefile was generated by # Bakefile 0.2.9 (http://www.bakefile.org) # Do not modify, all changes will be overwritten! # =========================================================================# ------------------------------------------------------------------------- # These are configurable options: # ------------------------------------------------------------------------- # C compiler CC = cl # Standard flags for CC CFLAGS = # Standard preprocessor flags (common for CC and CXX) CPPFLAGS = # Standard linker flags LDFLAGS =# ------------------------------------------------------------------------- # Do not modify the rest of this file! # ------------------------------------------------------------------------- ### Variables: ### MYAPPLICATION_CFLAGS = /MD /DWIN32 /D_CONSOLE /TC /W4 /Za $(CPPFLAGS) $(CFLAGS) MYAPPLICATION_OBJECTS = \ MyApplication_test.obj ### Conditionally set variables: ###### Targets: ### all: MyApplication.exe clean: -if exist .\*.obj del .\*.obj -if exist .\*.res del .\*.res -if exist .\*.pch del .\*.pch -if exist MyApplication.exe del MyApplication.exe -if exist MyApplication.ilk del MyApplication.ilk -if exist MyApplication.pdb del MyApplication.pdb MyApplication.exe: $(MYAPPLICATION_OBJECTS) link /NOLOGO /OUT:$@ /SUBSYSTEM:CONSOLE /ENTRY:"mainCRTStartup" $(LDFLAGS) @<< $(MYAPPLICATION_OBJECTS) user32.lib kernel32.lib shell32.lib gdi32.lib comctl32.lib ole32.lib winmm.lib << MyApplication_test.obj: .\test.c $(CC) /c /nologo /TC /Fo$@ $(MYAPPLICATION_CFLAGS) .\test.c
Наконец мой код скомпилирован с Visual Studio 2008.
До этого все было хорошо.
Теперь главная проблема приходит.
Visual Studio создает файл манифеста, который на самом деле представляет собой простой XML-файл.
Когда я удаляю манифест, мой exe не запускается.
Я имею в виду некоторые флаги компилятора / компоновщика, которые я хотел бы добавить, чтобы решить эту проблему, но я не знаю этот флаг.
Я с нетерпением жду вашей помощи.
Я нашел способ решить это. В Bakefile уже есть xml-тег
<postlink-command></postlink-command>
где мы можем запустить mt.exe, чтобы встроить манифест и, наконец, удалить манифест.
Код C:
/* main.c */
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("Hello world!\n");
system ("PAUSE");
return 0;
}
Бакфайл это (plain_exe.bkl):
<?xml version="1.0" ?>
<!--
===========================================
A SIMPLE EXE
===========================================
-->
<makefile>
<exe id="hello">
<sources> main.c </sources>
<sys-lib> user32.lib kernel32.lib shell32 </sys-lib>
<pic>on</pic>
<postlink-command> mt.exe -manifest $(id).exe.manifest -outputresource:$(id).exe;1
<postlink-command> del $(id).exe.manifest </postlink-command>
</exe>
</makefile>
Пакет (genbake.bat):
bakefile -f msvc plain_exe.bkl -o Makefile.mak
call C:\PROGRA~1\MICROS~1.0\VC\vcvarsall.bat
nmake -f Makefile.mak
cmd
Запустите пакет, чтобы построить все.
Других решений пока нет …