我一直在研究這一段時間,似乎無法理解這種情況 - 部分原因是我沒有完全理解發生了什麼(這就是我來到這裏的原因)。奇怪的mingw鏈接器錯誤與提升?
我在做一種升壓的hello world如下:
#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,現在有一個包含所有.lib文件的stage/lib文件夾。與升壓/線程庫的lib文件是:
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
現在在那裏的某個地方,我可以告訴大家,這顯然是我應該從升壓/線程獲得的功能,顯然它確實找到了lib文件,那麼它爲什麼不正確鏈接?
非常感謝您的幫助!
編輯:
我使用的bjam改造提升「階段」選項
bjam toolset=gcc 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
我很茫然,還是。
指定'toolset = gcc'是不夠的,你還需要'target-os = windows'用於MinGW。 – ildjarn