我有一个具有此目录结构的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,我知道这是一个编译错误,因为当我拥有它时一切正常在一个单一的源文件中。
我非常感谢你的帮助。
谢谢:)
答案 0 :(得分:2)
您尚未告诉我们您是否正在尝试make
(或make all
或make 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
)。
如果您make
或make all
或make server
,Make会尝试使用默认规则从server
构建server.cpp
,但未提及{{1} }}。你确定你不希望规则是“all:servidor”吗?