在編譯boost.log 的示例程序時,遇到了下面的錯誤:
zhifan$ make boost_log LDFLAGS='-lboost_log-mt' Undefined symbols for architecture x86_64: "boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", referenced from: ....
原因是因為如果使用動態連接就必須同時在編譯和連接階段使用-DBOOST_LOG_DYN_LINK 選項。 詳細信息參看:
http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/installation/config.html
簡單來說:
如果想使用動態鏈接, 需要使用-DBOOST_LOG_DYN_LINK -lboost_log-mt, 如果編譯和鏈接是分開的, 在編譯階段也需要-DBOOST_LOG_DYN_LINK
如果想使用靜態鏈接, 可以使用/usr/local/lib/libboost_log-mt.a /usr/local/lib/libboost_thread-mt.a /usr/local/lib/libboost_system-mt.a
下面的編譯方式在boost 149 下測試通過。
動態鏈接:
zhifan$ make boost_log CXXFLAGS='-DBOOST_LOG_DYN_LINK -lboost_log-mt' c++ -DBOOST_LOG_DYN_LINK -lboost_log-mt -ggdb -std=c++11 boost_log.cc -o boost_log zhifan$ otool -L boost_log boost_log: /usr/local/lib/libboost_log-mt.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
或者:
zhifan$ c++ -DBOOST_LOG_DYN_LINK -ggdb -std=c++11 -c -o boost_log.o boost_log.cc zhifan$ c++ -DBOOST_LOG_DYN_LINK -ggdb -std=c++11 -o boost_log boost_log.o -lboost_log-mt
下面方式是不行的
zhifan$ c++ -ggdb -std=c++11 -c -o boost_log.o boost_log.cc zhifan$ c++ -DBOOST_LOG_DYN_LINK -ggdb -std=c++11 -o boost_log boost_log.o -lboost_log-mt Undefined symbols for architecture x86_64: "boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", referenced from:
靜態鏈接:
zhifan$ make boost_log LDFLAGS='/usr/local/lib/libboost_log-mt.a /usr/local/lib/libboost_thread-mt.a /usr/local/lib/libboost_system-mt.a' c++ -ggdb -std=c++11 /usr/local/lib/libboost_log-mt.a /usr/local/lib/libboost_thread-mt.a /usr/local/lib/libboost_system-mt.a boost_log.cc -o boost_log zhifan$ otool -L boost_log boost_log: /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
或者:
zhifan$ c++ -ggdb -std=c++11 -c -o boost_log.o boost_log.cc zhifan$ c++ -ggdb -std=c++11 /usr/local/lib/libboost_log-mt.a -lboost_thread-mt /usr/local/lib/libboost_system-mt.a boost_log.o -o boost_log
參考文檔:
http://www.boost.org/doc/libs/1_56_0/libs/log/example/doc/tutorial_trivial.cpp
http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/installation/config.html