在make文件中包含boost库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在make文件中包含boost库相关的知识,希望对你有一定的参考价值。
我正在学习Boost并且我的make文件出现问题。这是我的基本makefile:
accesstimer: acctime.o btimer.o
g++ acctime.o btimer.o -o accesstimer
acctime.o: acctime.cpp btimer.h
g++ -c acctime.cpp
bentimer.o: btimer.cpp btimer.h
g++ -c btimer.cpp
当acctime.cpp中没有boost文件系统元素时,ake文件工作正常。一旦我添加了boost文件系统元素,我显然需要在make文件中引用boost libray,这是我遇到问题的地方。
以下行适用于单个文件编译:
g++ -I /usr/local/boost/boost_1_39_0 boosttest1.cpp -o bt1 /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a
现在我正在尝试将其集成到make文件中。我根据我在网上找到的信息尝试了很多,但没有一个正在运行这是我最新的:
accesstimer: acctime.o bentimer.o
g++ acctime.o bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -c -I /usr/local/boost/boost_1_39_0 acctime.cpp /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a
bentimer.o: bentimer.cpp bentimer.h
g++ -c bentimer.cpp
不幸的是我还是找不到Boost库,有人可以帮忙吗?谢谢
读过那些已经回答的人的建议我现在得到了这个:
accesstimer: acctime.o bentimer.o
g++ -L /usr/local/boost/boost_1_39_0 acctime.o /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -c acctime.cpp
bentimer.o: bentimer.cpp bentimer.h
g++ -c bentimer.cpp
但这仍然无法联系。
这是我收到的错误消息:
g++ -L /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer
acctime.o: In function boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)':
acctime.cpp:(.text._ZN5boost10filesystem6existsINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEbE4typeERKS7_[boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)]+0x26): undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)'
collect2: ld returned 1 exit status
make: *** [accesstimer] Error 1
遵循orsogufo的建议(谢谢!非常感谢)现在有这样的:
accesstimer: acctime.o bentimer.o
g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -c acctime.cpp
bentimer.o: bentimer.cpp bentimer.h
g++ -c bentimer.cpp
看起来更好,但仍然无法找到图书馆:
g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt.a
collect2: ld returned 1 exit status
make: *** [accesstimer] Error 1
我已经仔细检查过该位置,该库肯定位于:/usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a
现在不要使用这个:
accesstimer: acctime.o bentimer.o
g++ -L/usr/local/boost/boost_1_39_0 -lboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp
bentimer.o: bentimer.cpp bentimer.h
g++ -c bentimer.cpp
获得:
g++ -L/usr/local/boost/boost_1_39_0/stage/lib/ -llibboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt
collect2: ld returned 1 exit status
make: *** [accesstimer] Error 1
它正在使用:
accesstimer: acctime.o bentimer.o
g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp
bentimer.o: bentimer.cpp bentimer.h
g++ -c bentimer.cpp
感谢你的帮助
EDITED
链接目标文件以创建可执行文件(第一个makefile规则)时,必须使用-L
标志传递boost库的位置,并使用-l标志传递库的名称。
accesstimer: acctime.o bentimer.o
g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer
其中/usr/local/boost/boost_1_39_0/stage/lib
是包含库的目录,boost_filesystem
是没有开头lib
的库的文件名(根据需要修改这两个)。
另一个编辑您尝试链接的.a文件是错误的...库应该没有扩展名。
您需要将boost库添加到链接阶段(accesstimer目标行),而不是编译阶段(只需要包含路径)。
嗨以下是向cmake / make文件添加boost的完整过程。这个答案专门为cpp的新手程序员开发。
如果要在Makefile的帮助下添加boost库支持,则需要指定库路径(使用-L选项)和库(使用-l选项)。
-L path / to / the / libraries -l library
**现在如何找到图书馆的路径**
以下是诀窍:
- 打开终端和消防指令 $ locate boost> libboost.txt $ gedit libboost.txt
- 此命令将打开一个包含所有boost库路径的文本文件。
- 现在找到(“ctr + F”)libboost,它在此文本文件中突出显示了扩展名为.a和.so的boost库文件。
- 复制此.so文件所在的路径。 例如:如果.so文件存在于/usr/lib/x86_64-linux-gnu/libboost_filesystem.so上 然后将路径指定为:-L / usr / lib / x86_64-linux-gnu /
现在如何找到各自的图书馆?
- 这取决于您正在使用的增强功能/模块 例如:如果您正在使用boost线程,则需要以下库 libboost_filesystem.so libboost_thread.so libboost_system.so
- 使用-l选项按如下方式添加上面的库: -l lboost_filesystem -l lboost_thread -l lboost_system
希望这会对你有所帮助。如果有更简单的方法,请建议
以上是关于在make文件中包含boost库的主要内容,如果未能解决你的问题,请参考以下文章
如何构建boost以在库中包含boost_python-vcxx-mt-gd-1_xx.lib