GCC链接一个静态库
我看到过类似这样的问题,但每个人都有不同的答案和目录结构,不适合我。GCC链接一个静态库
我的生成文件:
CC = g++
DEBUG = -g -std=c++11
TARGET = main
OBJECT_FILES = BingResultSet.o main.o
INC_PATH = -I HTTPClientLib/include
LIB_PATH = -L HTTPClientLib/lib/
start: clean BingResultSet.o main.o
$(CC) $(DEBUG) $(INC_PATH) $(LIB_PATH) $(OBJECT_FILES) -o $(TARGET)
rm -f *.o
BingResultSet.o: BingResultSet.cpp BingResultSet.h
$(CC) $(DEBUG) $(INC_PATH) $(LIB_PATH) -c BingResultSet.cpp
main.o: main.cpp
$(CC) $(DEBUG) $(INC_PATH) $(LIB_PATH) -c main.cpp
clean:
rm -f $(OBJECT_FILES) $(TARGET)
我的文件结构:
/Desktop/DataMiner/.cpp, .h, and makefile
/Desktop/DataMiner/HTTPClientLib/include/HTTPClient.h
/Desktop/DataMiner/HTTPClientLib/lib/HTTPClient.a
是什么在我的makefile链接我的静态库的正确方法是什么?
这里是我的$ 0.02:
- 有没有涉及静态库。假设你的意思是.o文件
-
你混的依赖性和构建规则,而不是,避免重蹈建立规则:
$(TARGET): $(OBJECT_FILES) $(CXX) $(DEBUG) $(INC_PATH) $^ -o [email protected] $(LIB_PATH) %.o: %.cpp $(CXX) $(DEBUG) $(INC_PATH) -c $< -o [email protected]
您使用
CC
一个C++编译器。真奇怪。使用CXX
- 您使用
LDFLAGS
当你刚刚编译 你硬编码的源和目标路径。而是使用the automatic variables (
$^
,$<
for source;[email protected]
for destination)-
您试图硬编码头依赖关系。这很容易出错,并且会弄乱源代码规范(您不希望
$^
在您的命令行中列出.h
文件...)。相反,请使用gcc -MM
¹来为您生成依赖关系!接下来,做一个条件包括那些依赖关系:
.depends: $(CXX) -MM $(CXXFLAGS) -c *.cpp > [email protected] -include .depends
它通常是得心应手保持.o文件,因此您可以加快构建。当然,直到你自动生成头文件依赖关系,这不是一个好的计划。如果你坚持,你可以评论
.PRECIOUS
目标。中期目标是通过GNU自动删除请
这里的集成产品我结束了:
CXX = g++
TARGET = main
OBJECT_FILES = BingResultSet.o main.o
INC_PATH = -I HTTPClientLib/include
LIB_PATH = -L HTTPClientLib/lib/
CPPFLAGS = -g -std=c++11
CPPFLAGS+= $(INC_PATH)
# standard derived flags:
CXXFLAGS+=$(CPPFLAGS)
LDFLAGS+=$(LIB_PATH)
start: .depends $(TARGET)
$(TARGET): $(OBJECT_FILES)
$(CXX) $(CXXFLAGS) $^ -o [email protected] $(LDFLAGS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o [email protected]
clean:
rm -f .depends $(OBJECT_FILES) $(TARGET)
# to keep the .o files:
.PRECIOUS: $(OBJECT_FILES)
.depends:
$(CXX) -MM $(CXXFLAGS) -c *.cpp > [email protected]
-include .depends
一个非常简单的样本集的文件你:
$ make clean
rm -f .depends BingResultSet.o main.o main
$ make
g++ -MM -g -std=c++11 -I HTTPClientLib/include -c *.cpp > .depends
g++ -I HTTPClientLib/include -c BingResultSet.cpp -o BingResultSet.o
g++ -I HTTPClientLib/include -c main.cpp -o main.o
g++ -I HTTPClientLib/include BingResultSet.o main.o -o main -L HTTPClientLib/lib/
$ cat .depends
BingResultSet.o: BingResultSet.cpp BingResultSet.h
main.o: main.cpp BingResultSet.h
test.o: test.cpp
1(或相似,请参见手册页)
谢谢你,先生! –
@shawna你可以看到流的视频[约29:00](https://www.livecoding.tv/video/modular-boost-refactor-makefile-and-more/)(原谅任何咒骂)([实验] (http://chat.stackoverflow.com/transcript/10?m=24182469#24182469)) – sehe
好吧,谢谢哈哈 –
makefile在构建之前不应该要求运行'clean'来获得合理的结果。如果你需要你的makefile文件写得不正确。每个目标应创建一个目标名称(不是其他名称)的文件,以便make可以正确地完成其工作。 –
你问如何将'HTTPClient.a'链接到你的输出'main'二进制文件?你知道如何与静态库链接正常工作吗? (这是你如何在没有makefile的情况下手工完成的?) –
不确定你的意思是“手工没有makefile”。我知道如何链接VS上的静态库,但现在我试图在Linux上构建项目,所以gcc上的链接有点不同,给我一些问题。 –