在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

**现在如何找到图书馆的路径**

以下是诀窍:

  1. 打开终端和消防指令 $ locate boost> libboost.txt $ gedit libboost.txt
  2. 此命令将打开一个包含所有boost库路径的文本文件。
  3. 现在找到(“ctr + F”)libboost,它在此文本文件中突出显示了扩展名为.a和.so的boost库文件。
  4. 复制此.so文件所在的路径。 例如:如果.so文件存在于/usr/lib/x86_64-linux-gnu/libboost_filesystem.so上 然后将路径指定为:-L / usr / lib / x86_64-linux-gnu /

现在如何找到各自的图书馆?

  1. 这取决于您正在使用的增强功能/模块 例如:如果您正在使用boost线程,则需要以下库 libboost_filesystem.so libboost_thread.so libboost_system.so
  2. 使用-l选项按如下方式添加上面的库: -l lboost_filesystem -l lboost_thread -l lboost_system

希望这会对你有所帮助。如果有更简单的方法,请建议

以上是关于在make文件中包含boost库的主要内容,如果未能解决你的问题,请参考以下文章

如何构建boost以在库中包含boost_python-vcxx-mt-gd-1_xx.lib

如何在 C++ 窗口中包含第三方库?

如何在 CMake 中包含 boost::future?

在 MFC dll 中包含 boost mutex 头文件时断言

如何在 CMakeLists 中包含库头文件

在代码片段中包含类型转换