トップ «前の日記(2017-04-09) 最新 次の日記(2017-04-22)» 編集

日々の破片

著作一覧

2017-04-16

_ Visual Studio 2017でclangをコンソールで利用する

VS2015のときは、c2.dll問題とかあってもなんとなくクリアできていたのだが(clangはx86用だということさえわかれば、あとは適切なほうのclang.exeのPATHを設定する)、VS2017では常に失敗するようになった。

-vを付けてやり直せと出てきたので、やってみると、link.exeの起動に失敗している。

おや? と思ってVS2015のclangで見てみると、こちらはlink.exeをフルパスで起動している。ふつうに考えてみれば、MSがclangをコマンドラインで利用できないように一工夫したようだ。本気か?

で、解決策として、clang.exeと同じディレクトリにlink.exeを入れるとか考えてみたが、ばかげている。

であれば、しょうがない。

MSBuildの出番である。

とはいえ、なんかいろいろあるので、AppWizardにコンソールアプリケーションをclang指定で作らせたvcxprojから余分なものを削除することにした。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup>
    <VCProjectVersion>15.0</VCProjectVersion>
    <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v141_clang_c2</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
    <Configuration>Release</Configuration>
    <Platform>Win32</Platform>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ItemDefinitionGroup>
    <Link>
      <SubSystem>Console</SubSystem>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="$(src)" />
  </ItemGroup>
</Project>

Developer Command Promptを使って

MSBuild /p:src=ソースファイル名

で実行する(1ファイル専用)。実行ファイル名はvcxprojの名前になる。

x64の場合は

MSBuild /p:src=ソースファイル名 /p:Platform=x64

Releaseディレクトリに生成されてしまうのが気にくわないが、これ以上調べる気にはならないので、こんなものだな。

clangを使っているかclを使っているかを確認するには、可変長配列を書けばわかる。

char a[strlen(argv[0]) + strlen(argv[1]) + 1];
strcat(strcpy(a, argv[0]), argv[1]));
燃えよウータン(期間生産限定盤)(ウータン・クラン)

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え