查看: 1489|回复: 15
|
請問 有誰知道如何使用C++ 的Boost庫?
[复制链接]
|
|
我的電腦剛install了一套red hat Linux Enterprise AS4, 有3.4版的gcc compiler, 我現在急需
寫有關計算日期的程式, 部份資料會推算至百餘年前, 偶又不會用Java, 所以只好用boost 的date/time.
偶曾去boost的官方网站copy他們的example下來我的電腦run, 結果竟出現一大堆的錯誤,
why? 難道還要跑一次bjam? install Linux 的時候沒有順便搞掟嗎?謝謝
[ 本帖最后由 sktan007 于 23-10-2006 07:21 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 2-11-2006 11:42 AM
|
显示全部楼层
bjam 来compile 和连接产生出library.
example 错误可能就是没有先compile boost 库。
example如果只是单纯使用库里面的template照理就不需要bjam, 不过include path 的设定一定要对。 |
|
|
|
|
|
|
|
楼主 |
发表于 3-11-2006 09:40 AM
|
显示全部楼层
等了將近一星期, 終于有人回答, 真該謝謝你.
請問 command line 上的 -L path name 該如何設定? |
|
|
|
|
|
|
|
楼主 |
发表于 3-11-2006 09:52 AM
|
显示全部楼层
等了將近一星期, 終于有人回答, 真該謝謝你.
請問 command line 上的 -L path name 該如何設定?Include
我沒有設定, 直接使用 g++ -o example example1.cpp
因為用-c 去檢查文法, 完全過關, 而且偶在/usr/lib底下找到這
些library,
libboost_date_time.so
libboost_date_time.so.1
libboost_filesystem.so.a
libboost_regex.a
...還有很多
明顯全是 boost 的東西. |
|
|
|
|
|
|
|
楼主 |
发表于 3-11-2006 09:55 AM
|
显示全部楼层
等了將近一星期, 終于有人回答, 真該謝謝你.
請問 command line 上的 -L path name 該如何設定?Include
我沒有設定, 直接使用 g++ -o example example1.cpp
因為用-c 去檢查文法, 完全過關, 而且偶在/usr/lib底下找到這
些library,
libboost_date_time.so
libboost_date_time.so.1
libboost_filesystem.so.a
libboost_regex.a
...還有很多
明顯全是 boost 的東西. 所以要run bjam 嗎? |
|
|
|
|
|
|
|
发表于 4-11-2006 12:48 PM
|
显示全部楼层
看来你是没有设定好库的路径。
尝试在该路径下执行以下指令
ldd example
把输出贴在这儿。 |
|
|
|
|
|
|
|
楼主 |
发表于 5-11-2006 02:49 PM
|
显示全部楼层
jangancari 兄, 請問Idd 是什么command ? 我打入Idd /root/newC/temp.cpp, temp.cpp是一個將example簡化
過的計算日期程式, 結果Linux說Idd command not
found. |
|
|
|
|
|
|
|
发表于 8-11-2006 01:23 PM
|
显示全部楼层
原帖由 sktan007 于 5-11-2006 02:49 PM 发表
jangancari 兄, 請問Idd 是什么command ? 我打入Idd /root/newC/temp.cpp, temp.cpp是一個將example簡化
過的計算日期程式, 結果Linux說Idd command not
found.
是 ldd 不是 idd 。
syntax 是 ldd <编译出来的output> 所以, 你的情况应该是 ldd temp.o 或者 ldd temp
ldd 的功能是显示 你编译出来的程序需要什么shared library, 而这些library 在当前的session 下是呼叫哪一个文件。 |
|
|
|
|
|
|
|
楼主 |
发表于 9-11-2006 07:42 AM
|
显示全部楼层
以下的程式是偶將 example 里九百多行程式簡化之後的結果, 是即將在新 project
用到的功能, 使用 g++ -c temp.cpp 去檢查文法已過關了.
#include <iostream>
#include <string>
#include "boost/date_time/gregorian/gregorian.hpp"
using namespace std;
using namespace boost::gregorian;
int main() {
date d(2002, Jan, 1);
cout << d;
date_duration dd(5);
date d2 = d + dd; //add five day to d, and store it to d2
cout << d2 << endl;
return 0;
}
執行g++ -o temp temp.cpp, temp.cpp 結果如下:
/tmp/ccTpNakZ.o(.gnu.linkonce.t._ZNK5boost9gregorian10greg_month14as_long_stringEc+0x13): In function `boost::gregorian::greg_month::as_long_string(char) const':
: undefined reference to `boost::gregorian::greg_month::as_long_string() const'
/tmp/ccTpNakZ.o(.gnu.linkonce.t._ZNK5boost9gregorian10greg_month15as_short_stringEc+0x13): In function `boost::gregorian::greg_month::as_short_string(char) const':
: undefined reference to `boost::gregorian::greg_month::as_short_string() const'collect2: ld returned 1 exit status
用ldd temp 或 ldd temp.o 去試, 結果都是 "沒有那個文件或目錄".
偶使用man g++ 去查, 發現/usr/lib是內定的搜索路徑, 可以不必 -l 指定, 但是若
/usr/lib 里已有 libboost_date_time.o , 為何編譯會在 link 不成功 ???
我還發現, 程式就死在 cout << d2 << endl; 那一行上, 是 d2 不能 cout ....
[ 本帖最后由 sktan007 于 9-11-2006 07:46 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 9-11-2006 09:28 AM
|
显示全部楼层
原来你的程序还没有通过连接的阶段, ldd 是用来查询已经连接成功但运行不成功的程序。
= = =
你混淆了 -L 和 -l 的功能
-L 是设定库文件的搜寻路径 , 而-l 是设定需要连接的库文件
你得到这个错误讯息是因为你没有设定需要连接的库文件。
你尝试把编译(+连接)的指令改成以下指令
g++ -lboost_date_time -o temp temp.cpp |
|
|
|
|
|
|
|
楼主 |
发表于 9-11-2006 10:06 AM
|
显示全部楼层
老大,我打入$g++ -llibboost_date_time.a -o temp temp.cpp 結果
/usr/bin/ld : cannot find -llibboost_date_time.a
collect2 : ld returned 1 exit status
這個設法也不對。。。 |
|
|
|
|
|
|
|
发表于 9-11-2006 01:16 PM
|
显示全部楼层
原帖由 sktan007 于 9-11-2006 10:06 AM 发表
老大,我打入$g++ -llibboost_date_time.a -o temp temp.cpp 結果
/usr/bin/ld : cannot find -llibboost_date_time.a
collect2 : ld returned 1 exit status
這個設法也不對。。。
我应该没有说过是这样设定 。。。
boost的库文件是shared object .so 。 去连接static library .a。 肯定找不到 |
|
|
|
|
|
|
|
楼主 |
发表于 9-11-2006 08:07 PM
|
显示全部楼层
對不起!偶雖然有多年寫 VB 的經驗, 不過在C++還是一隻菜鳥, 容易闹笑話.
我按指示打入, 下面一行
$g++ -lboost_date_time -o temp temp.cpp 結果...
/tmp/ccMWQjk8.o(.gnu.linkonce.t._ZNK5boost9gregorian10greg_month14as_long_stringEc+0x13): In function `boost::gregorian::greg_month::as_long_string(char) const':
: undefined reference to `boost::gregorian::greg_month::as_long_string() const'
/tmp/ccMWQjk8.o(.gnu.linkonce.t._ZNK5boost9gregorian10greg_month15as_short_stringEc+0x13): In function `boost::gregorian::greg_month::as_short_string(char) const':
: undefined reference to `boost::gregorian::greg_month::as_short_string() const'collect2: ld returned 1 exit status |
|
|
|
|
|
|
|
发表于 10-11-2006 12:52 AM
|
显示全部楼层
真对不起, 我功力不足, 之前的指示有点错误。
g++ -o temp temp.cpp -lboost_date_time
连接库选项必须在被编译文件的后面, 这是gcc 的语法要求。
我已经尝试在CentOS (red hat Linux Enterprise clone 版)测试过了, 通过编译, 连接和运行。
[ 本帖最后由 jangancari 于 10-11-2006 11:47 AM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 10-11-2006 08:49 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 10-11-2006 11:46 AM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|