代码之家  ›  专栏  ›  技术社区  ›  Community wiki

在make文件中包含提升库

  •  5
  • Community wiki  · 技术社区  · 2 年前

    我正在学习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库,这就是我遇到问题的地方。

    以下行适用于单个文件编译:

    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
    

    按照奥的建议(谢谢!非常感谢)现在有这个:

    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 回复  |  直到 15 年前
        1
  •  11
  •   John Kugelman Michael Hodel    4 年前

    当您链接对象文件以创建可执行文件(您的第一个makefile规则)时,必须通过 -L 旗帜 以及带有-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文件是错误的。。。这个库不应该有扩展名。

        2
  •  4
  •   Hridaynath    8 年前

    以下是将boost添加到cmake/make文件的完整过程。这个答案是专门为cpp中的新手程序员开发的。

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

    -L路径/到/库 -l llibrary

    **现在如何找到库的路径**

    以下是诀窍:

    1. 打开终端和消防命令

      $locate boost>libboost.txt

      $gedit libboost.txt

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

    3. 现在查找(“ctr+F”) libboost ,在该文本文件中突出显示了扩展名为.a和.so的boost库文件。

    4. 复制此 所以 文件存在。

      例如:If.so file present as on /usr/lib/x86_64-linux-gu/libboost_filesystem.so

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

    现在如何找到相应的库?

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

      例如: 如果您正在使用增强线程,您将需要以下库

      libboost_filesystem.so

      libboost_thread.so

      libboost_system.so

    2. 使用-l选项按如下方式添加以上库:

      -l主机文件系统

      -l主机线程

      -l成本系统

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

        3
  •  2
  •   haggai_e    17 年前

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