このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

Poly/MLのビルド

configureは終わって、makeするとエラーする。

make[2]: Entering directory `/c/Installed/polyml-github/libpolyml'
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I..  -O3
 -mthreads -I../libffi/include -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x600 -DGIT_V
ERSION=v5.6-254-gb3ed98b -Wall -DMODULEDIR=/usr/local/lib/polyml/modules   -O3 -
mthreads -I../libffi/include -MT arb.lo -MD -MP -MF .deps/arb.Tpo -c -o arb.lo a
rb.cpp
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -O3 -mthreads -I../libffi/includ
e -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x600 -DGIT_VERSION=v5.6-254-gb3ed98b -Wal
l -DMODULEDIR=/usr/local/lib/polyml/modules -O3 -mthreads -I../libffi/include -M
T arb.lo -MD -MP -MF .deps/arb.Tpo -c arb.cpp -o arb.o
In file included from processes.h:38:0,
                 from arb.cpp:91:
locking.h:102:5: error: 'CONDITION_VARIABLE' does not name a type
make[2]: *** [arb.lo] Error 1

エラー箇所。

// Simple condition variable.  N.B.  The Windows code does not
// support multiple threads blocking on this condition variable.
class PCondVar {

// ....

private:
#if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H))
    pthread_cond_t cond;
#elif defined(HAVE_WINDOWS_H)
    CONDITION_VARIABLE cond;
#endif
};

CONDITION_VARIABLEは未定義。pthread_cond_tと定義されるには、

  1. Windowsでないか、または WindowsでもCygwin である。(POSIX的環境)
  2. pthread.h を持っている。

それ以外でWindowsHがあるときはCONDITION_VARIABLEとなる。なら、Windows.hに定義されているはず。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682052%28v=vs.85%29.aspx に次のような例がある。

CRITICAL_SECTION CritSection;
CONDITION_VARIABLE ConditionVar;

void PerformOperationOnSharedData()
{ 
   EnterCriticalSection(&CritSection);

   // Wait until the predicate is TRUE

   while( TestPredicate() == FALSE )
   {
      SleepConditionVariableCS(&ConditionVar, &CritSection, INFINITE);
   }

   // The data can be changed safely because we own the critical 
   // section and the predicate is TRUE

   ChangeSharedData();

   LeaveCriticalSection(&CritSection);

   // If necessary, signal the condition variable by calling
   // WakeConditionVariable or WakeAllConditionVariable so other
   // threads can wake
}

Widows.hがインクルードされてない?

いや、

#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif

あるな。??

[追記]
windows.h が古いだけだった。
[/追記]