佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1489|回复: 15

請問 有誰知道如何使用C++ 的Boost庫?

[复制链接]
发表于 23-10-2006 09:15 AM | 显示全部楼层 |阅读模式
我的電腦剛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 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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

把输出贴在这儿。
回复

使用道具 举报

Follow Us
 楼主| 发表于 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 下是呼叫哪一个文件。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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 | 显示全部楼层
老大, 現在不只可以叫大哥, 叫大爺都行!真的過關了, 不過我還是想問一下
, 那個 [colo=red] 是什么來的?
:
回复

使用道具 举报

发表于 10-11-2006 11:46 AM | 显示全部楼层
原帖由 sktan007 于 10-11-2006 08:49 AM 发表
老大, 現在不只可以叫大哥, 叫大爺都行!真的過關了, 不過我還是想問一下
, 那個  是什么來的?
:


叫大爷不好, 我最讨厌人家说我老的。

你也应该知道那个colo=red 是键误啦。

我自己也学到东西, 因为我一向来都用IDE 来写程序, 对command line 编译没有什么经验。

以前都被微软的VB “荼毒”了, 最近才抓回C++ 来学习。

[ 本帖最后由 jangancari 于 10-11-2006 11:48 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 12-11-2024 10:02 AM , Processed in 0.142550 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表