2013年8月21日 星期三

[Linux] 增加 stack size 解決 g++ 編譯問題: Out of memory / virtual memory exhausted: Cannot allocate memory @ Ubuntu 12.04

最近在編譯同事的 C++ 程式時常常 crash 掉,噴訊息:
g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.6/README.Bugs> for instructions.
追了一會兒後,才發現自己編譯 boost 1.54.0 也碰過這種事,查看 dmesg 有類似的訊息:
Out of memory: Kill process 5309 (cc1plus) score 327 or sacrifice child
Killed process 5309 (cc1plus) total-vm:720204kB, anon-rss:18672kB, file-rss:8kB
例如編譯 boost 1.54.0:
~/boost_1_54_0$ "g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pthread -fPIC -fno-strict-aliasing -ftemplate-depth-1024 -DBOOST_ALL_NO_LIB=1 -DBOOST_CHRONO_DYN_LINK=1 -DBOOST_DATE_TIME_DYN_LINK=1 -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_LOG_DYN_LINK=1 -DBOOST_LOG_SETUP_BUILDING_THE_LIB=1 -DBOOST_LOG_SETUP_DLL -DBOOST_LOG_USE_NATIVE_SYSLOG -DBOOST_LOG_USE_SSSE3 -DBOOST_LOG_WITHOUT_EVENT_LOG -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_THREAD_BUILD_DLL=1 -DBOOST_THREAD_DONT_USE_CHRONO=1 -DBOOST_THREAD_POSIX -DBOOST_THREAD_USE_DLL=1 -DDATE_TIME_INLINE -DNDEBUG  -I"." -c -o "bin.v2/libs/log/build/gcc-4.6/release/build-no/log-api-unix/threading-multi/settings_parser.o" "libs/log/src/settings_parser.cpp"
噴訊息:
virtual memory exhausted: Cannot allocate memory
增加 stack-size 後 (-Wl,--stack=0x2000000),即可解決:

~/boost_1_54_0$ "g++" -Wl,--stack=0x2000000 -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pthread -fPIC -fno-strict-aliasing -ftemplate-depth-1024 -DBOOST_ALL_NO_LIB=1 -DBOOST_CHRONO_DYN_LINK=1 -DBOOST_DATE_TIME_DYN_LINK=1 -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_LOG_DYN_LINK=1 -DBOOST_LOG_SETUP_BUILDING_THE_LIB=1 -DBOOST_LOG_SETUP_DLL -DBOOST_LOG_USE_NATIVE_SYSLOG -DBOOST_LOG_USE_SSSE3 -DBOOST_LOG_WITHOUT_EVENT_LOG -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_THREAD_BUILD_DLL=1 -DBOOST_THREAD_DONT_USE_CHRONO=1 -DBOOST_THREAD_POSIX -DBOOST_THREAD_USE_DLL=1 -DDATE_TIME_INLINE -DNDEBUG  -I"." -c -o "bin.v2/libs/log/build/gcc-4.6/release/build-no/log-api-unix/threading-multi/settings_parser.o" "libs/log/src/settings_parser.cpp"

對於編譯 boost 時,或許可以這樣用(更正確的用法應該是 LD_FLAGS):

~/boost_1_54_0$ ./bootstrap.sh
~/boost_1_54_0$ CXX="g++ -Wl,--stack=0x2000000" ./b2 -j2

沒有留言:

張貼留言