0

我有一个具有此目录结构的 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 >)' 的引用”,我知道这是由于 Makefile 造成的编译错误,因为当我把它全部放入时一切正常一个单一的源文件。

我非常感谢你的帮助。

谢谢 :)

4

1 回答 1

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 将尝试使用未提及serverserver.cpp默认规则进行构建leveldb.cpp。您确定不希望规则为“all:servidor”吗?

于 2012-04-24T20:27:08.250 回答