2015-07-20 117 views
1

我看到过类似这样的问题,但每个人都有不同的答案和目录结构,不适合我。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

makefile在构建之前不应该要求运行'clean'来获得合理的结果。如果你需要你的makefile文件写得不正确。每个目标应创建一个目标名称(不是其他名称)的文件,以便make可以正确地完成其工作。 –

+0

你问如何将'HTTPClient.a'链接到你的输出'main'二进制文件?你知道如何与静态库链接正常工作吗? (这是你如何在没有makefile的情况下手工完成的?) –

+0

不确定你的意思是“手工没有makefile”。我知道如何链接VS上的静态库,但现在我试图在Linux上构建项目,所以gcc上的链接有点不同,给我一些问题。 –

回答

1

这里是我的$ 0.02:

  1. 有没有涉及静态库。假设你的意思是.o文件
  2. 你混的依赖性和构建规则,而不是,避免重蹈建立规则:

    $(TARGET): $(OBJECT_FILES) 
        $(CXX) $(DEBUG) $(INC_PATH) $^ -o [email protected] $(LIB_PATH) 
    
    %.o: %.cpp 
        $(CXX) $(DEBUG) $(INC_PATH) -c $< -o [email protected] 
    
  3. 您使用CC一个C++编译器。真奇怪。使用CXX

  4. 您使用LDFLAGS当你刚刚编译
  5. 你硬编码的源和目标路径。而是使用the automatic variables ($^, $< for source; [email protected] for destination)

  6. 您试图硬编码头依赖关系。这很容易出错,并且会弄乱源代码规范(您不希望$^在您的命令行中列出.h文件...)。相反,请使用gcc -MM¹来为您生成依赖关系!

    接下来,做一个条件包括那些依赖关系:

    .depends: 
        $(CXX) -MM $(CXXFLAGS) -c *.cpp > [email protected] 
    
    -include .depends 
    
  7. 它通常是得心应手保持.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(或相似,请参见手册页)

+0

谢谢你,先生! –

+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

+0

好吧,谢谢哈哈 –