我正在学习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
感谢您的帮助
答案 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
**现在如何找到图书馆的路径**
以下是诀窍:
打开终端和开火命令
$ locate boost&gt; libboost.txt
$ gedit libboost.txt
此命令将打开一个文本文件,其中包含所有增强库路径。
现在找到(&#34; ctr + F&#34;) libboost ,它会在此文本文件中突出显示boost扩展名为.a和.so的库文件。
复制此 .so 文件所在的路径。
例如:如果.so文件存在于 /usr/lib/x86_64-linux-gnu/libboost_filesystem.so
然后将路径指定为: -L / usr / lib / x86_64-linux-gnu /
现在如何找到相应的库?
这取决于您正在使用的增强功能/模块
例如:如果您使用的是强化线程,则需要以下库
<强> libboost_filesystem.so 强>
<强> libboost_thread.so 强>
<强> libboost_system.so 强>
使用-l选项添加上述库:
-l lboost_filesystem
-l lboost_thread
-l lboost_system
希望这会对您有所帮助,如果有更简单的方法,请建议