2012-11-04 59 views
8

我是CMake的新手。我在Linux上测试了我正在制作的程序。这个程序使用(POSIX线程LIB),所以在我CMakeList,我说:CMake:在Windows中找不到<pthread.h>

find_package(Threads) 

它适用于Linux的发行商(拱,薄荷,Ubuntu的,...),但现在,我想它WINDOWS32(Visual Studio的9 2008年),我生成过程中得到这个消息:

-- Looking for include file pthread.h - not found 

(当我编译输出的项目文件,pthread.h确实没有找到)。

在Windows上,考虑到 “C:\并行线程” 作为我的并行线程的目录,我在路径定义:

  • “C:\并行线程\包括”(其中位于著名的 “pthread.h”)
  • “C:\并行线程\”(在CMake的寻找一个“有”的地方的情况下)

但我仍然得到同样的错误(即使删除后高速缓存)。我知道我可以在项目中“手动”添加Pthread,或者在CMakeList.txt中定义一些常量,但我认为这不是CMake的原理:我可以在所有系统上使用相同的“CMakeList.txt”,对吧?所以我怎么告诉CMake“嘿!看这里!Pthread在这个目录!”。 也许Cmake没有查找PATH,但是在另一个环境变量中,但是我没有找到这个信息。

谢谢您的阅读。

编辑:我不知道这是否有差别,但我的项目是一个C++项目(非C)

+0

由于没有标准在运行cmake-gui时,Windows CMake上include和库文件的路径经常需要帮助很长时间。第二个选择是许多查找器查找环境变量。因此,例如在我的Windows安装中找到ITK,我在启动cmake-gui的cmd.exe会话中设置了ITK_DIR。许多软件包也一样。还有find_package选项,可以用来帮助控制CMake在哪里寻找可以提供帮助的软件包。 – drescherjm

+0

在CMake 2.8.10中查看FindThreads的代码,它看起来像在Windows上默认使用Windows线程。 – drescherjm

+0

我没有测试过。查看是否设置了CMAKE_USE_PTHREADS_INIT或者只是CMAKE_USE_WIN32_THREADS_INIT。 – drescherjm

回答

0

据我所知,P线程本身并不支持Windows平台。除非你使用一些东西一样

win services for unix

仅适用于Windows有win32的线程。

然而,这是提供在Windows

pthreads on win32

+1

是的,我把它放在“C:\ pthread \” – Neozaru

+0

错误好吧,我以为你在谈论你在这里复制的linux pthread包。 – fayyazkl

+3

不,我得到了用于win32的pthreads,包含头文件和预编译的软件包。但CMake没有找到它 – Neozaru

1

显然,CMAKE_USE_WIN32_THREADS_INIT是在所有平台范围内有用的并行线程的项目。该变量在调用findPackage(Threads)时生成或初始化,理想情况下,它在所有平台上处理链接问题,以防线程库需要与可执行文件链接。基本上它会在类似平台的平台上生成相应的线程库名称,并且在诸如不需要显式线程库进行链接的Windows平台上为空。 参考:CMake的findThreads https://cmake.org/cmake/help/v3.0/module/FindThreads.html?highlight=threads

+0

我检查了链接,但现在呢?你能详细解释一下吗? –

2

我做什么,我编辑了cmake的文件:

option(CMAKE_USE_WIN32_THREADS_INIT "using WIN32 threads" ON) 

option(gtest_disable_pthreads "Disable uses of pthreads in gtest." ON) 

(我使用谷歌测试)