c++ - 安装旧的 2005 BOOST 库时遇到问题

标签 c++ ubuntu boost

大家好

虽然我是 ubuntu C 编程的新手 在 Windows 中进行 C 编程方面经验丰富。

我最近遇到了一些编写的代码 2005 年,我有兴趣了解它们的工作原理。

这些代码需要 BOOST 库来编译,但它们不会 在我的 ubuntu 12.04 上出现的最新 BOOST 版本上编译。 我将 gcc 编译器设置为 lenient 以便它忽略所有这些错误 消息。代码确实编译并随后运行。

但是,当我使用 GDB 调试器观察程序的运行情况时 我注意到程序运行的方式可能有错误 由于使用不同的 BOOST 版本而不是原始版本。因此 我喜欢安装我下载的代码对应的BOOST版本。

为此,我安装了 Ubuntu 5.04 和 BOOST 1.33.0,它们似乎是在 2005 年底创建的。我下载了它 但我没有找到任何关于如何安装它的详细说明。 关于使用 BOOST jam 只有模糊的描述,我玩过 BOOST 果酱了很长一段时间没有成功。 而且这个老BOOST没有安装命令之类的 “sudo apt-install boost-dev”样式选项

所以我想问问有没有人能给出一个简单易懂的分步说明 关于如何安装从上述链接下载的 BOOST 库。 喜欢……

  • 第一步:从boost网页下载boost jam
  • step2: 在 home/boost/解压然后输入 make configure

……等等……

非常感谢您提供任何有用的信息。

此处附加新内容 回应给出的评论

您好,我查看了您的链接提供的信息,并且 设法运行您的链接给出的 boost 库示例。 也就是说,我可以使用命令编译单个 cpp 文件

g++ -I boost_1_33_0 test.cpp -o test

(我将 boost 库和要编译的 cpp 文件保存在 同一个文件夹)

不过,我感兴趣的程序包是用make构建的(不是cmake)。 我有一些编写 cmake 文件的经验,但没有编写文件的经验。 而且我在 程序包。自述文件只有一句话说我 需要在不解释其含义的情况下安装 boost。

我认为这意味着要么我必须构建并执行 makeinstall the boost 要么 我可以在 makefile 中添加一些行作为链接。我想 也许您可以快速指出 makefile 中缺少的内容。

自述文件:

To compile, go into the moses directory and do 'make'. You'll need the latest boost libraries. If compilation still fails for weird reasons, you could try g++ with the -fpermissive (newer versions reject lots of code that was ok with older ones). If you are going to be making changes and recompiling frequently you'll probably want to disable -O3 in the makefile (I use templates liberally, so -O3 really speeds up the code, but really slows down compilation).

和生成文件:

CC = g++

PROJ_NAME = moses

LINK_FLAGS = -Wall -Iutils/ -Itrees/ -Irewrite -I./ -Imodeling/ -Ifitness/ \
             -Ialignment/ -Isim/ -Ilocal/ -O3
COMP_FLAGS = -Wall -Wno-sign-compare -Iutils/ -Itrees/ -Irewrite -I./ \
             -Imodeling/ -Ifitness/ -Ialignment/ -Isim/ -Ilocal/ -O3

src := $(wildcard *.cc) $(wildcard utils/*.cc) $(wildcard trees/*.cc) $(wildcard    modeling/*.cc) $(wildcard fitness/*.cc) $(wildcard alignment/*.cc) $(wildcard main/*.cc) $(wildcard rewrite/*.cc) $(wildcard sim/*.cc) $(wildcard local/*.cc)

obj := $(patsubst %.cc,%.o,$(src))

all: $(PROJ_NAME)

%.o: %.cc
    $(CC) $(COMP_FLAGS) $< -c -o $@

$(PROJ_NAME): $(obj)
    $(CC) $(LINK_FLAGS) $^ -o $(PROJ_NAME)
run:
    $(PROJ_NAME)
clean:
    find -regex ".*~\|.*\.o"|xargs rm -f
    rm -f $(PROJ_NAME)
    rm -f $(PROJ_NAME).exe*

depend:
    makedepend -Y -- $(COMP_FLAGS) -- $(src)



utils/exceptions.o: utils/exceptions.h utils/utils.h
utils/io_util.o: utils/io_util.h utils/tree.h utils/basic_types.h

# ......lots more lines like that.........

最佳答案

我有一个关于 Boost 1.34.1 的旧指令,它是这样写的(项目特定的东西被切掉了):

  • 解压 boost 源
  • cd 进入 tools/jam/src
  • 运行./build.sh来构建bjam
  • cd 进入主源目录
  • tools/jam/src/bin.linux/bjam threading=multi --layout=system --toolset=gcc --without-python variant=release --prefix=/usr/local install

--without-python 是必需的,因为目标系统没有安装 Python,导致构建失败。

显然,您可以/需要调整各个设置(如线程支持、发布与调试变体)以满足您的需求,但这应该是一个很好的起点。

如果您需要 ICU 支持(针对 Boost.Regex 和 Boost.Locale),它会变得更加复杂......

请注意,多年来构建过程发生了变化;您不应该对更新的升级版本使用相同的过程。这正是我当时使用的。

编辑:

至于问题的第二部分,如果 boost 安装在标准系统目录中,则 Makefile 不需要显式引用 Boost。

您不必声明 -I/usr/include 进行编译,因为它是自动搜索的; -L/usr/lib 在连接期间也是如此。

Makefile 的作者将编译器标志逐字复制到链接器标志中这一事实也无助于直观性......;-)

如果您在自定义目录中有 Boost(仅 header ,或者通过在我的构建说明的 --prefix 选项中声明自定义目录),您需要进行以下修改(寻找“boost ”):

LINK_FLAGS = -Wall -Iutils/ -Itrees/ -Irewrite -I./ -Imodeling/ -Ifitness/ \
             -Ialignment/ -Isim/ -Ilocal/ -L /path/to/boost/libs -O3 
COMP_FLAGS = -Wall -Wno-sign-compare -Iutils/ -Itrees/ -Irewrite -I./ \
             -Imodeling/ -Ifitness/ -Ialignment/ -Isim/ -Ilocal/ \
             -I /path/to/boost/includes -O3

这应该可以解决问题。由于 Makefile 不链接任何 Boost 二进制文件(例如 -l boost_program_options 或类似的东西),它似乎只使用了 Boost headers,这将使-L/path/to/boost/libs 部分(实际上,上面详述的整个编译步骤)是多余的。您应该能够通过简单地解压缩源代码并使用 -I/path/to/boost/headers 将 header 目录作为附加包含目录来摆脱困境。

关于c++ - 安装旧的 2005 BOOST 库时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20215866/

相关文章:

c++ - vector::clear 如何在不丢失已分配内存的情况下调用析构函数

linux - contiki 中的 cooja 模拟器中的缓冲区 View 或缓冲区列表器是什么?

java ubuntu 添加到上面板

c++ - 如何在 boost 日期时间中创建日期范围?

c++ - 如果日期在 2116 年,boost timed_wait 不会等待

c++ - 将 .bat 转换为 .exe 而不依赖于 cmd.exe

c++ - 如何制作未定义的移位 “correct”

c++ - 为什么 C++0x 右值引用不是默认值?

node.js - 使用 brew 安装 Node 和 npm

c++ - Boost GraphML 格式