CXXFLAGS
过去,当 boost 的构建与您的程序不同时,我也遇到过类似的问题。这是一组伪完整的引导指令。
# Configure, build, and install boost
./bootstrap.sh \
--prefix=${PWD}/.local \
--with-libraries=...,filesystem,...
./b2 \
-q \
-d2 \
-j4 \
--debug-configuration \
--disable-filesystem2 \
--layout=tagged \
--build-dir=${PWD}/obj \
cxxflags="-v -std=c++11 -stdlib=libc++" \
linkflags="-stdlib=libc++" \
link=shared \
threading=multi \
install
重要的部分是cxxflags
and linkflags
。以我的经验,这通常是因为 macports 编译时不使用-stdlib=libc++
,但在使用编译C++11
代码时需要使用-std=c++11
. 常见的症状包括 gdb 中的随机回溯,这表明某个特定结构内部的指针存在问题,该结构深埋在 boost 库/模板中。
从上面可以看出,我将 boost 的本地副本构建到每个项目的目录(例如${PWD}/.local
)中,然后在开发过程中链接到本地版本,直到打包(此时我静态链接或做其他事情)。
# In a GNUmakefile
LOCAL_DIR=${PWD}/.local
INC_DIR=${LOCAL_DIR}/include
LIB_DIR=${LOCAL_DIR}/lib
CPPFLAGS=-I"${INC_DIR}"
CXXFLAGS=-std=c++11 -stdlib=libc++
LDFLAGS=-stdlib=libc++ -L"${LIB_DIR}"
MYPROG_SRCS=myprog.cpp
MYPROG_OBJS=$(MYPROG_SRCS:.cpp=.o)
%.o : %.cpp %.hpp
${CXX} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<
myprog: ${MYPROG_OBJS}
${CXX} ${LDFLAGS} -o $@ $^ ${LIBS}
底线:您需要在 boost 和您的程序之间进行匹配CPPFLAGS
。LDFLAGS