Как установить pthread_win32 (библиотека потоков Windows pthread / posix) для Visual Studio 2005? - PullRequest
0 голосов
/ 13 апреля 2011

Просто чтобы прояснить ситуацию - я искал в интернете и обратно информацию о том, как это сделать

Мне нужна помощь в настройке pthread_Win32 для работы с Visual Studio 2005. Я программирую на C, и у меня есть несколько многопоточных заданий для записи с использованием pthread.h. Однако, поскольку pthread является родным для unix, я должен написать весь мой код, выполнить ftp, а затем ssh в удаленную систему unix моего класса, чтобы запустить его. Это заставляет разработку длиться намного дольше и невероятно неэффективно. Мне бы очень хотелось (больше всего на свете), чтобы это работало на моей машине с win32, поэтому я могу развиваться в визуальной студии, как я это делал довольно давно.

Я установил файл pthread.lib и файл pthread.h в соответствующие каталоги lib / header, где находятся все остальные файлы. DLL с другой стороны (фактическая библиотека) я поместил в c: \ windows \ system32. Я пытался добавить DLL в качестве зависимости (проект правой кнопкой мыши -> ссылки -> Добавить новую ссылку), но, как утверждали другие, все, что я получаю, - это пустое диалоговое окно без возможности добавления каких-либо файлов DLL или чего-либо еще. Кажется, он распознает заголовочный файл, но я получаю следующие ошибки при компиляции:

1> Связь ...

1> main.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _pthread_join, указанный в функции _main

1> main.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _pthread_create, на который ссылается функция _main

1> main.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _pthread_exit, указанный в функции _fcount

Из моего исследования я определил, что это проблема с DLL, и я предполагаю, что он не может найти определения функций, на которые я ссылался, в моем коде. Я искал высоко и низко, и я не могу найти какой-либо способ преодолеть эту проблему. Я добавил каталоги файлов lib / header к своему компоновщику, на всякий случай, но это не решило проблему. Мне нужно что-то сделать в Visual Studio, чтобы указать, что мне нужна pthreadVC2.dll в качестве зависимости проекта - и на данный момент это кажется невозможным (и крайне неприятным).

Какие-нибудь слова мудрости?

Большое спасибо

Ответы [ 3 ]

3 голосов
/ 05 декабря 2013

Я недавно прошел через эту проблему.Похоже, что префикс __ imp __ добавляется к имени функции в случае, если pthread.h включен в режим динамического связывания.Просто добавьте определение PTW32_STATIC_LIB в ваш проект или ваш исходный код перед тем, как pthread.h решит проблему.

#define PTW32_STATIC_LIB
#include <pthread.h>

Хотя я еще не закончилпоскольку Visual Studio теперь пытается связать с _ [FuncName] вместо [FuncName]

В Visual Studio функция, как представляется, объявляется по-разному, когда вы собираетесьсвязать их статически (.lib) или динамически (.dll).

Чтобы определить функцию, вы будете связывать динамически:

__declspec (dllimport) int myFunc(int myArgs) ;

Чтобы определить функцию, которую вы экспортируете для динамического связывания:

__declspec (dllexport) int myFunc(int myArgs) ;

И самое простое: определить функцию, которую вы будете статически связывать:

int myFunc(int myArgs) ;

[EDIT]

Я собираюсь продолжитьрасследования и прошли через это в справочном центре MS.Похоже, что во избежание эффекта _ [FuncName] необходимо определить статическую библиотечную функцию следующим образом:

int __cdecl myFunc(int MyArgs) ;
1 голос
/ 13 апреля 2011

Вы добавили pthreadVC.lib (или какую-либо конкретную нужную вам библиотеку) к свойству проекта:

Linker/Input/Additional Dependencies

Недостаточно просто разместить файл библиотеки в определенном каталоге, компоновщик должен бытьсказал использовать его как вход.

0 голосов
/ 19 мая 2013

Недостаточно просто добавить pthreadVC2.lib в список компоновщиков. Вы также должны добавить дополнительную библиотеку, такую ​​как pthreadVCE2.lib и pthreadVSE2.lib.

Я столкнулся с той же проблемой, но затем решил ее, добавив эти файлы.

...