#include boost而不使用libs linux

时间:2010-11-25 13:28:36

标签: c++ linux boost include

问题:目前我正在编译Ubuntu,但我的服务器正在运行Fedora / Redhat。 Ubunutu使用boost 1.42和linux最新时刻是1.41。所以我决定下载boost lib并将其放在我工作区的文件夹中

这是目录结构

/workspace
    /myprogram
        /src
            /main.cpp
        /Debug
            /main
    /boost_1_42_0
        /downloaded from boost.com

在我的main.cpp中,我有这段代码

#include "../../boost_1_42_0/boost/regex.hpp"

这甚至是不可能还是我在错误的树上咆哮。我试图编译它,但它失败了(ofcourse)有13个错误

如果我错过了一些信息,请提出要求,我试着提供它

制作文件(我的程序称为vlogd)

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include src/subdir.mk
-include src/class/vException/subdir.mk
-include src/class/mysqlcppapi/subdir.mk
-include src/class/mysqlcppapi/row/subdir.mk
-include src/class/mysqlcppapi/query_results/subdir.mk
-include src/class/mysqlcppapi/query/subdir.mk
-include src/class/mysqlcppapi/fields/subdir.mk
-include src/class/mysqlcppapi/exceptions/subdir.mk
-include src/class/mysqlcppapi/datetime/subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C++_DEPS)),)
-include $(C++_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(CC_DEPS)),)
-include $(CC_DEPS)
endif
ifneq ($(strip $(CPP_DEPS)),)
-include $(CPP_DEPS)
endif
ifneq ($(strip $(CXX_DEPS)),)
-include $(CXX_DEPS)
endif
ifneq ($(strip $(C_UPPER_DEPS)),)
-include $(C_UPPER_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables 

# All Target
all: vlogd

# Tool invocations
vlogd: $(OBJS) $(USER_OBJS)
    @echo 'Building target: $@'
    @echo 'Invoking: GCC C++ Linker'
    g++ -L/usr/lib64/mysql -L../../boost_1_42_0/lib/ -o"vlogd" $(OBJS) $(USER_OBJS) $(LIBS)
    @echo 'Finished building target: $@'
    @echo ' '

#     Other Targets
clean:
    -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) vlogd
    -@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

目标文件

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

USER_OBJS :=

LIBS := -lmysqlclient -lboost_regex

2 个答案:

答案 0 :(得分:5)

如果您使用gcc只需指定正确的包含路径和链接路径,则无需使用完整路径

gcc -I../../boost_1_42_0/ myprogram.cpp -L../../boost_1_42_0/lib -lboostXYZ

因此,所有#include <boost/...>标题和库将首先在您的本地提升中搜索。

修改
关注评论中的问题。

默认情况下,-l将搜索.so个库。因此,如果使用例如libboost_regex.soliboost_regex.a,默认情况下,您会链接到.so。如果您链接到.so,则在工作服务器上需要拥有这些库的正确版本(可以安装几个boost版本)。

如果要隐式链接到静态版本,请使用完整路径

gcc .... ../../boost_1_42_0/lib/libboost_regex.a

gcc ... -Wl,-Bstatic -L../../boost_1_42_0/lib -lboost_regex -Wl,-Bdynamic

或(在较新版本的ld中)

gcc ... -L../../boost_1_42_0/lib -l:libboost_regex.a

使用带有ldd命令的二进制文件,您可能会看到它的共享库依赖项,并检查是否有升级库

ldd ./yourapp

答案 1 :(得分:1)

我在您的应用中构建boost库的好方法是使用bjam构建您的应用程序(具有所有跨平台的友好性)

我这样解决你的问题 - 你可以在这里查看一般文档http://www.boost.org/doc/tools/build/doc/html/index.html

在我的jamroot.jam(在我的项目的基础上) - 你的/工作区文件夹 - 我有

#Name this location $(TOP),
path-constant TOP : . ;
## The location of the boost library
path-constant BOOST_BASE : ($TOP)/boost_1_42_0 ;  

#Define an alias to the regex libray
alias regex-library     
      : $(BOOST_BASE)/libs/regex/build//boost_regex
      : <include>$(BOOST_BASE) ;


# build your project file
build-project ./myprogram/build ;

然后在myprogram / build目录中,我有一个名为Jamfile.v2的文件

project myprogram
  : source-location ../src  #your src directory
  : requirements <include>../src #your headerfiles can be in a different place if you wish 
             <warnings>all 
  : default-build   <threading>multi # for example
  : build-dir $(TOP)/build #where you want your object files put
;

exe myprogram   : main.cpp  
                 $(TOP)//regex-library # bjam should sort out the rest
         :
     <include> # any other includes
    ; 

alias install : install-bin ; 
# where you want your program installed
install install-bin : myprogram : <location>$(TOP)/bin ; 

希望这会有所帮助。我已经从我的文件中复制了这个,所以希望它们能够正常工作 - 但是在将目录结构放入其中时我有可能犯了错误。如果它不起作用,请告诉我。

这个系统的优点是你实际上构建了库 - 所以所有的编译器标志都是正确的。此外,如果升级库,则只需更改BOOST_BASE标志即可。此外,构建应该在Windows和Linux上工作,无需任何修改....

一切顺利,

汤姆