在make文件中包含boost库

时间:2009-08-20 11:27:57

标签: boost makefile linker

我正在学习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 

不幸的是,stlill无法找到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 

感谢您的帮助

3 个答案:

答案 0 :(得分:9)

<强> 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文件是错误的...库应该没有扩展名。

答案 1 :(得分:2)

您需要将boost库添加到链接阶段(accesstimer目标行),而不是编译阶段(只需要包含路径)。

答案 2 :(得分:0)

嗨以下是向cmake / make文件添加boost的完整过程。这个答案是专门为cpp。

的新手程序员开发的

如果要在Makefile的帮助下添加boost库支持,则需要指定库路径(使用-L选项)和库(使用-l选项)。

-L path / to / the / libraries -l llibrary

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

以下是诀窍:

  1. 打开终端和开火命令

      

    $ locate boost&gt; libboost.txt

         

    $ gedit libboost.txt

  2. 此命令将打开一个文本文件,其中包含所有增强库路径。

  3. 现在找到(&#34; ctr + F&#34;) libboost ,它会在此文本文件中突出显示boost扩展名为.a和.so的库文件。

  4. 复制此 .so 文件所在的路径。

    例如:如果.so文件存在于 /usr/lib/x86_64-linux-gnu/libboost_filesystem.so

    然后将路径指定为: -L / usr / lib / x86_64-linux-gnu /

  5. 现在如何找到相应的库?

    1. 这取决于您正在使用的增强功能/模块

      例如:如果您使用的是强化线程,则需要以下库

      <强> libboost_filesystem.so

      <强> libboost_thread.so

      <强> libboost_system.so

    2. 使用-l选项添加上述库:

      -l lboost_filesystem

      -l lboost_thread

      -l lboost_system

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