CentralScrutinizer
CentralScrutinizer

Reputation: 63

msbuild Link step doesn't run

I'm trying to build a very simple C program using MSBuild. Previously this was put together by an intern using Visual Studio but we are not going to be using VS here and I want this built with MSBuild so I can automate it.

I have constructed my vcxproj file from scratch following the walkthrough on MSDN and the other reference docs there. I am able to compile the obj files no problem but the Link step never seems to run so I am not getting an executable output.

There is a function called main in AppDrv.c files, is it safe to assume that will be detected by the linker as the entry point, or do I need to tell msbuild manually some how that this is there?

Here is the entirety of my vcxproj. I can't find anything in the docs that says I need to tell it to link, shouldn't it happen automatically if the CL step completes OK? Do I need to somehow explicitly list the obj files to link, or can MSBuild figure that out on its own?

<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>

    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>

  </ItemGroup>


  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />


  <PropertyGroup>
    <ConfigurationType>Console</ConfigurationType>
    <PlatformToolset>v140</PlatformToolset>
  </PropertyGroup>


  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <!--Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /-->


  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>false</LinkIncremental>
    <IncludePath>$(UniversalCRT_IncludePath)$(ProjectDir)helper\include;$(WindowsSDK_IncludePath)$(VC_IncludePath)</IncludePath>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <CompileAs>CompileAsC</CompileAs>
      <WarningLevel>TurnOffAllWarnings</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <OutputFile>slip_windows_helper.exe</OutputFile>
      <ShowProgress>LinkVerbose</ShowProgress>
    </Link>
  </ItemDefinitionGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
    <IncludePath>$(UniversalCRT_IncludePath)$(ProjectDir)helper\include;$(WindowsSDK_IncludePath)$(VC_IncludePath)</IncludePath>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <CompileAs>CompileAsC</CompileAs>
      <WarningLevel>TurnOffAllWarnings</WarningLevel>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>


  <ItemGroup>
    <ClCompile Include="$(ProjectDir)helper\src\AppDrv.c" />
    <ClCompile Include="$(ProjectDir)helper\src\Buffers.c" />
    <ClCompile Include="$(ProjectDir)helper\src\SingleThreadAsync.c" />
    <ClCompile Include="$(ProjectDir)helper\src\Slip.c" />
    <ClCompile Include="$(ProjectDir)helper\src\Utils.c" />
  </ItemGroup>

  <ItemGroup>
    <ClInclude Include="$(ProjectDir)helper\include\AppDrv.h" />
    <ClInclude Include="$(ProjectDir)helper\include\Buffers.h" />
    <ClInclude Include="$(ProjectDir)helper\include\SingleThreadAsync.h" />
    <ClInclude Include="$(ProjectDir)helper\include\Slip.h" />
    <ClInclude Include="$(ProjectDir)helper\include\Utils.h" />
    <ClInclude Include="$(ProjectDir)helper\include\SharedHeader.h" />
  </ItemGroup>


  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Targets" />


    <Target Name="Info">
        <Message Text="Target to output MSBuild information" />
        <Message Text="OutputAssembly: $(OutputAssembly)" />
        <Message Text="VCTargetsPath: $(VCTargetsPath)" />
        <Message Text="Includes: $(IncludePath)" />
        <Message Text="VC_IncludePath:$(VC_IncludePath)" />
        <Message Text="WindowsSDK_IncludePath:$(WindowsSDK_IncludePath)" />
        <Message Text="the property config is: $(Configuration)" />
        <Message Text="final output directory: $(OutDir)" />
    </Target>


</Project>

Here is the command I'm using to launch the build:

MSBuild.exe slipwinhelper.vcxproj /p:configuration=Debug /p:platform=Win32 /p:OutDir=target\ /nologo /t:Clean;Build;Info

UPDATE: I got it to run the link task by overriding the AfterBuild event:

  <Target Name="AfterBuild">
      <Link Sources="Debug\AppDrv.obj;Debug\Buffers.obj;Debug\SingleThreadAsync.obj;Debug\Slip.obj;Debug\Utils.obj" />
  </Target>

But now it is giving me unresolved externals on SetupApi calls in the code. I have tried changing the SubSystem to Windows, that doesn't seem to work.

Upvotes: 0

Views: 315

Answers (1)

stijn
stijn

Reputation: 35911

A quick comparision with a VS generated files shows a bunch of differences/lacking properties, including the file from VS having

<ConfigurationType>Application</ConfigurationType>

whereas you are speciyfing Console which is not something msbuild recognizes.

Upvotes: 1

Related Questions