问题:目前我正在编译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
答案 0 :(得分:5)
如果您使用gcc
只需指定正确的包含路径和链接路径,则无需使用完整路径
gcc -I../../boost_1_42_0/ myprogram.cpp -L../../boost_1_42_0/lib -lboostXYZ
因此,所有#include <boost/...>
标题和库将首先在您的本地提升中搜索。
修改强>
关注评论中的问题。
默认情况下,-l将搜索.so
个库。因此,如果使用例如libboost_regex.so
和liboost_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上工作,无需任何修改....
一切顺利,
汤姆