c++ - 使文件不适用于 boost

标签 c++ boost makefile

我正在为 Makefile 使用以下结构:

OBJECTS := time.o
PROGRAM := time
CPPFLAGS += -Iusr/include/boost_1_49_0 -Lusr/include/boost_1_49_0/stage/lib
CXXFLAGS := -Wall -ggdb3
LDFLAGS += -lboost_date_time
$(PROGRAM) : $(OBJECTS)
g++ -o time time.cpp

clean :
rm $(PROGRAM) $(OBJECTS)

但是当我输入 make 时,它​​给了我很多错误 - 包括:

undefined reference to `boost::gregorian::greg_month::as_short_string() const' time.cpp:
(.text._ZN5boost9date_time15month_formatterINS_9gregorian10greg_monthENS0_13simple_formatIcEEcE12format_monthERKS3_RSo[boost::date_time::month_formatter<boost::gregorian::greg_month, boost::date_time::simple_format<char>, char>::format_month(boost::gregorian::greg_month const&, std::basic_ostream<char, std::char_traits<char> >&)]+0x56):
    undefined reference to `boost::gregorian::greg_month::as_long_string() const'
collect2: ld returned 1 exit status

当我使用 g++ -Wall -Iusr/include/boost_1_49_0 -Lusr/include/boost_1_49_0/stage/lib -o time time.cpp -lboost_date_time 时,代码编译正常,所以我的 Makefile 有问题。请帮忙。注意:我尝试放置 -L <directory> LDFLAG 中的标志变量,但这也不起作用。

最佳答案

LDFLAGS 不在您的 Makefile 中使用 - 既不直接使用也不通过内置规则隐式使用。以下应该有效:

$(PROGRAM): $(OBJECTS)
    $(CXX) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@ 

make 是一个强大的工具。但是,使用起来并不简单。如果您不是被迫使用 make,我建议您仔细研究替代方案。我个人推荐使用 bjam/boost-build。下面是一个简单的 Jamroot 示例:

project
    : requirements <cflags>-Wall <cflags>-ggdb3
    ;

using gcc ;

lib boost_date_time
    :
    : <search>/usr/include/boost_1_49_0/stage/lib
    :
    : <include>/usr/include/boost_1_49_0
    ;

exe time
    : time.cpp foo.cpp bar.cpp boost_date_time
    ;

关于c++ - 使文件不适用于 boost ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10241867/

相关文章:

c++ - Boost 程序选项设置选项的最小值和最大值

c++ - 没有页面文件的 Windows XP 内存管理 - 后果是什么。堆碎片?

c++ - 试图用 C++11 替换旧的随机 API

c++ - 使用 "Curiously Recurring Template Pattern"的增量数

c++ - BOOST_FUSION_ADAPT_ADT找不到设置方法

c++ - boost shared_ptr 初始化为类成员

c++ - 内存映射文件类、线程和引用计数

c++ - -I 在 makefile 中标记不会导致找到头文件

Makefile 中的 Cflags 没有出现

c - 将 m32 标志添加到 Makefile 时 select() 失败