GCC链接静态库

时间:2015-07-20 23:18:42

标签: c++ linux gcc makefile

我在SO上看到过类似的问题但是每个人都有不同的答案和目录结构对我不起作用。

我的makefile:

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中链接我的静态库的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这是我的0.02美元:

  1. 没有涉及静态库。假设你的意思是.o文件
  2. 您混合依赖项和构建规则,而不是重复构建规则:

    $(TARGET): $(OBJECT_FILES)
        $(CXX) $(DEBUG) $(INC_PATH) $^ -o $@ $(LIB_PATH)
    
    %.o: %.cpp
        $(CXX) $(DEBUG) $(INC_PATH) -c $< -o $@
    
  3. 您使用CC作为C ++编译器。真奇怪。使用CXX

  4. 您刚刚编译时使用了LDFLAGS
  5. 您对源路径和目标路径进行了硬编码。而是使用the automatic variables ($^, $< for source; $@ for destination)

  6. 您尝试对标头依赖项进行硬编码。这容易出错并且会混淆源规范(您不希望$^在命令行中列出.h个文件...)。相反,使用gcc -MM¹为您生成依赖项!

    接下来,对这些依赖项进行条件包含:

    .depends:
        $(CXX) -MM $(CXXFLAGS) -c *.cpp > $@
    
    -include .depends
    
  7. 保留.o文件通常很方便,因此您可以加快构建速度。当然,在您自动生成标头依赖项之前,这不是一个好的计划。如果您坚持,可以对.PRECIOUS目标发表评论。中级目标由GNU Make

  8. 自动删除

    以下是我最终提供的综合服务:

    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 $@ $(LDFLAGS)
    
    %.o: %.cpp
        $(CXX) $(CXXFLAGS) -c $< -o $@
    
    clean:
        rm -f .depends $(OBJECT_FILES) $(TARGET)
    
    # to keep the .o files:
    .PRECIOUS: $(OBJECT_FILES)
    
    .depends:
        $(CXX) -MM $(CXXFLAGS) -c *.cpp > $@
    
    -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
    

    ¹(或类似,见手册页)