2013-02-28 122 views
0

我在Mac 10.7.5上使用gcc47通過Eclipse CDT中的macports編寫了一個小應用程序,以學習C++ 11中的新功能。我有大量的代碼編譯,鏈接和運行。當我將該調用添加到「異步」時,出現鏈接器錯誤。最簡單的程序會重現鏈接錯誤。預先感謝您的幫助。用Macports編譯C++鏈接錯誤gcc47

#include <iostream> 
#include <future> 

using namespace std; 

void bar() 
{ 
cout << "!!!Hello World!!!" << endl; 
} 

int main() { 
future<void> f1(async(bar)); 

return 0; 
} 

的輸出是:

21:56:46 **** Incremental Build of configuration Debug for project Hello **** 
make all 
Building file: ../src/Hello.cpp 
Invoking: GCC C++ Compiler g++ -D__GXX_EXPERIMENTAL_CXX0X__ -I/opt/local/include/gcc47/c++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/Hello.d" -MT"src/Hello.d" -o "src/Hello.o" "../src/Hello.cpp" 
Finished building: ../src/Hello.cpp 
Building target: Hello 
Invoking: MacOS X C++ Linker g++ -o "Hello" 
./src/Hello.o Undefined symbols for architecture x86_64: 
"___emutls_v._ZSt11__once_call", referenced from: 
     void std::call_once<void (std::__future_base::_State_base::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()>&, bool&), 
std::__future_base::_State_base* const, 
std::reference_wrapper<std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()> >, 
std::reference_wrapper<bool> >(std::once_flag&, void 
(std::__future_base::_State_base::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()>&, bool&), 
std::__future_base::_State_base* const&&, 
std::reference_wrapper<std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()> >&&, 
std::reference_wrapper<bool>&&) in Hello.o 
     void std::call_once<void (std::thread::*)(), std::reference_wrapper<std::thread> >(std::once_flag&, void 
(std::thread::*&&)(), std::reference_wrapper<std::thread>&&) in 
Hello.o "___emutls_v._ZSt15__once_callable", referenced from: 
     void std::call_once<void (std::__future_base::_State_base::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()>&, bool&), 
std::__future_base::_State_base* const, 
std::reference_wrapper<std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()> >, 
std::reference_wrapper<bool> >(std::once_flag&, void 
(std::__future_base::_State_base::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()>&, bool&), 
std::__future_base::_State_base* const&&, 
std::reference_wrapper<std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()> >&&, 
std::reference_wrapper<bool>&&) in Hello.o 
     void std::call_once<void (std::thread::*)(), std::reference_wrapper<std::thread> >(std::once_flag&, void 
(std::thread::*&&)(), std::reference_wrapper<std::thread>&&) in 
Hello.o 
     void std::__once_call_impl<std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_base::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()>&, bool&)> 
(std::__future_base::_State_base*, 
std::reference_wrapper<std::function<std::unique_ptr<std::__future_base::_Result_base, 
std::__future_base::_Result_base::_Deleter>()> >, 
std::reference_wrapper<bool>)> >() in Hello.o 
     void std::__once_call_impl<std::_Bind_simple<std::_Mem_fn<void (std::thread::*)()> (std::reference_wrapper<std::thread>)> >() in 
Hello.o ld: symbol(s) not found for architecture x86_64 collect2: 
error: ld returned 1 exit status make: *** [Hello] Error 1 

回答

0

的信息在http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54806https://trac.macports.org/ticket/36093表明,這種誤差是由於GCC的MacPorts的版本中的錯誤。根據https://trac.macports.org/ticket/36093#comment:35這已被固定爲MacPorts的r98493。如果您更新了該端口存儲庫的修訂版,然後重新安裝了GCC,我希望您的問題會消失。

+0

謝謝你的回答。這些鏈接對我對這個問題的理解非常有幫助。不過,我上週第一次安裝了gcc47,而r98493是從五個月前開始安裝的。我是否需要回到較早的版本? – rj905 2013-02-28 13:48:17