2012-11-04 10 views
8

Jestem początkującym użytkownikiem programu CMake. Przetestowałem to na Linuksie dla programu, który robię. Ten program używa (POSIX Threads lib), więc w moim CMakeList, dodałem:CMake: <pthread.h> nie znaleziono w systemie Windows

find_package(Threads) 

Działa na distribs Linuksa (Arch, Mint, Ubuntu, ...), ale teraz próbuję go w Windows32 (Visual Studio 9 2008), i ten komunikat podczas generowania:

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

(i kiedy mogę skompilować plik projektu wyjściowego, pthread.h rzeczywiście nie znaleziono).

W Windows, biorąc pod uwagę "C: \ pthread" w moim katalogu pthread, że określony w ścieżce:

  • "C: \ pthread \ include" (gdzie znajduje się słynny "pthread.h")
  • „C: \ pthread \” (w przypadku, gdy CUpewnij wyszukuje „obejmują” gdzieś)

Ale nadal ten sam błąd (nawet po usunięte cache). Wiem, że mogłem "ręcznie" dodać Pthread do mojego projektu lub zdefiniować pewne stałe w CMakeList.txt, ale myślę, że to nie jest zasada CMake: mógłbym użyć SAME "CMakeList.txt" na wszystkich systemach, prawda? Więc jak mogę powiedzieć CMake'owi: "Hej, wygląda tutaj! Pthread jest w tym katalogu!". Może Cmake nie wygląda w PATH, ale w innej zmiennej środowiskowej, ale nie znalazłem tej informacji.

Dziękuję za przeczytanie.

EDIT: Nie wiem, czy to robi różnicę, ale mój projekt jest projektem C++ (nie C)

+0

Ponieważ nie ma standardu Ścieżki do plików włączeń i bibliotek w oknach CMake często musi być wspomagane przez długi czas, gdy uruchomisz cmake-gui. Druga opcja polega na tym, że wielu poszukiwaczy wygląda w zmiennych środowiskowych. Na przykład, aby znaleźć ITK na mojej instalacji Windows, mam ITK_DIR ustawiony w sesji cmd.exe, z której uruchomiłem cmake-gui. To samo dotyczy wielu pakietów. Dostępne są również opcje find_package, które możesz wykorzystać do sterowania miejscem, w którym CMake szuka pakietów, które mogą być pomocne. – drescherjm

+0

Patrząc na kod dla FindThreads w CMake 2.8.10 wygląda na to, że w systemie Windows domyślnie będzie używany wątek Windows. – drescherjm

+0

Nie przetestowałem tego. Sprawdź, czy ustawiono CMAKE_USE_PTHREADS_INIT lub po prostu CMAKE_USE_WIN32_THREADS_INIT. – drescherjm

Odpowiedz

0

O ile mi wiadomo, nie jest Pthreads natywnie obsługiwany na platformie Windows. Chyba użyć niektóre rzeczy jak

win services for unix

Windows ma tylko wątki win32.

Jednakże, jest to projekt, który zapewnia pthreads na oknach

pthreads on win32

+1

Tak, i umieściłem go w "C: \ pthread \" – Neozaru

+0

err ok. Myślałem, że mówisz o pakiecie pthread linux, który tutaj skopiowałeś. – fayyazkl

+3

Nie, mam pthreads dla win32, z nagłówkami i wstępnie skompilowanymi pakietami. Ale CMake go nie znajduje – Neozaru

1

Widocznie CMAKE_USE_WIN32_THREADS_INIT jest użyteczna w kontekście wszystkich platformach. Ta zmienna jest generowana lub inicjowana podczas wywoływania findPackage (Threads), najlepiej obsługuje problemy z łączeniem na wszystkich platformach w przypadku, gdy biblioteka wątków jest wymagana do połączenia z plikiem wykonywalnym. Zasadniczo generuje ona odpowiednią nazwę biblioteki wątków na platformach typu unix, takich jak platformy i jest pusta na platformie, na przykład w systemie Windows, gdzie nie jest wymagana biblioteka do łączenia wątków. referencyjny: CWprowadä findThreads https://cmake.org/cmake/help/v3.0/module/FindThreads.html?highlight=threads

+0

Sprawdziłem link, ale co teraz? Czy możesz krok po kroku wyjaśnić nieco więcej szczegółów? –

2

Co zrobiłem, edytowany plik cmake:

option(CMAKE_USE_WIN32_THREADS_INIT "using WIN32 threads" ON) 

i

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

(używam testowego Google)

Powiązane problemy