无法使用Makefile从不同目录中的不同源文件进行编译

时间:2012-04-24 19:53:07

标签: c++ makefile

我有一个具有此目录结构的C ++项目:

src
├── database
│   ├── database.hpp
│   ├── leveldb.cpp
│   └── leveldb.hpp
├── Makefile
└── server.cpp

server.cpp包括“database / database.hpp”和“database / leveldb.hpp”。 leveldb.cpp包含“leveldb.hpp”

我的Makefile到目前为止(请记住,$ LEVELDB是Google的leveldb库的路径,与我的leveldb.hpp和cpp文件不同,后者代表一个自定义的类):

CC=g++
LEVELDB=/route/to/Googles/library/leveldb
BOOST=/route/to/boost/cpp-netlib-0.9.2

DATABASE=/route/to/my/project/src/database

CFLAGS=-I$(LEVELDB)/include -I$(BOOST) -Wall -O2
LDFLAGS=-L$(LEVELDB) -lleveldb -lpthread -lboost_system -lboost_thread -pthread

all:server

server: server.cpp database/leveldb.cpp
    $(CC) -o $@ $(CFLAGS) -I$(DATABASE) $< $(LDFLAGS) -L$(DATABASE)

我无法编译。它给我一个错误“对LevelDB :: LevelDB(std :: basic_string,std :: allocator&gt;)'的未定义引用”,因为Makefile,我知道这是一个编译错误,因为当我拥有它时一切正常在一个单一的源文件中。

我非常感谢你的帮助。

谢谢:)

1 个答案:

答案 0 :(得分:2)

您尚未告诉我们您是否正在尝试make(或make allmake server)或make servidor。无论哪种方式,问题在于您没有将leveldb定义链接到目标。

在这条规则中:

servidor: server.cpp database/leveldb.cpp
    $(CC) -o $@ $(CFLAGS) -I$(DATABASE) $< $(LDFLAGS) -L$(DATABASE)

您正在使用自动变量$<,这意味着第一个先决条件,(server.cpp)。您应该使用$^,这意味着所有先决条件(server.cpp database/leveldb.cpp)。

如果您makemake allmake server,Make会尝试使用默认规则从server构建server.cpp,但未提及{{1} }}。你确定你不希望规则是“all:servidor”吗?