Я уже некоторое время работаю над этим и, похоже, не могу понять ситуацию - отчасти потому, что я не до конца понимаю, что происходит (именно поэтому я и пришел сюда).
Я делаю что-то вроде «Привет, мир!» Следующим образом:
#include <boost/thread/thread.hpp>
#include <cstdio>
void helloworld() {
std::printf("HELLO FROM A BOOST THREAD!");
}
int main(int argc, char **argv) {
boost::thread t(&helloworld);
t.join();
}
Это на Windows. Я сохранил каталог Boost в C: \ Boost. Я запустил bootstrap и bjam, и теперь у меня есть папка stage / lib, которая содержит все файлы .lib. Файлы lib, относящиеся к библиотеке boost / thread:
libboost_thread-vc100-mt.lib
libboost_thread-vc100-mt-1_46_1.lib
libboost_thread-vc100-mt-gd.lib
libboost_thread-vc100-mt-gd-1_46_1.lib
Теперь я компилирую:
g++ -c main.cpp -I/Boost
эта строка работает нормально, я получаю main.o. Тогда:
g++ -o test.exe main.o -L/Boost/stage/lib -llibboost_thread-vc100-mt
И вот тут возникает проблема. Прежде всего, если бы я не набрал аргумент -l так, как я это сделал, MinGW даже не смог бы найти файл. Значение, если бы я попытался:
-lboost_thread-vc100-mt
вместо того, как я набрал его выше (и как я думал, что это должно быть сделано), ld завершит работу без такого файла. Во всяком случае, теперь это вывод, который я получаю из этой строки:
main.o:main.cpp:(.text+0x47): undefined reference to `_imp___ZN5boost6thread4joinEv'
main.o:main.cpp:(.text+0x55): undefined reference to `_imp___ZN5boost6threadD1Ev'
main.o:main.cpp:(.text+0x70): undefined reference to `_imp___ZN5boost6threadD1Ev'
main.o:main.cpp:(.text$_ZN5boost6threadC1IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)]+0x23): undefined reference to `_imp___ZN5boost6thread12start_threadEv'
collect2: ld returned 1 exit status
Теперь где-то там, я могу сказать, что это, очевидно, функции, которые я должен получать из boost / thread, и, очевидно, он находит файл lib, так почему он не связывается правильно?
Большое спасибо за любую помощь!
EDIT:
Я перестроил буст, используя опцию bjam "stage"
bjam toolset=gcc stage
Теперь, после завершения сборки, у меня остается папка stage / lib с файлами .a, как и следовало ожидать. Это библиотеки, связанные с бустом / потоком:
libboost_thread-mgw45-mt-1_46_1.a
libboost_thread-mgw45-mt-d-1_46_1.a
Тем не менее, связывание следующим образом:
g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1
выводит точно такие же ошибки. Также попробовал:
g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1 -static
Я все еще в растерянности.