C++ GCC链接静态库

C++ GCC链接静态库,c++,linux,gcc,makefile,C++,Linux,Gcc,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) $(D

我在网上看到过这样的问题,但每个人都有不同的答案和目录结构,这对我来说并不适用

我的生成文件:

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 $@ $(LIB_PATH)
    
    %.o: %.cpp
        $(CXX) $(DEBUG) $(INC_PATH) -c $< -o $@
    
  • 保存.o文件通常很方便,这样可以加快构建速度。当然,在您自动生成标题依赖项之前,这不是一个好的计划。如果您坚持,您可以对
    .PRECIOUS
    目标进行注释。GNU Make会自动删除中间目标

  • 以下是我最终得到的集成产品:

    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
    


    ⑨(或类似内容,请参见手册页)

    在重新构建生成文件以获得合理结果之前,不应要求运行
    clean
    。如果您需要确认您的makefile没有正确写入。每个目标都应该创建一个目标名称(而不是其他名称)的文件,以便make能够正确执行其工作。您是否在询问如何将
    HTTPClient.a
    链接到您的输出
    main
    二进制文件中?您知道与静态库的链接是如何正常工作的吗?(这就是在没有makefile的情况下手动执行此操作的方式?)不确定“在没有makefile的情况下手动”是什么意思。我知道如何在VS上链接静态libs,但是现在我正在尝试在Linux上构建这个项目,所以gcc上的链接有点不同,这给了我一些问题。我的意思是你知道你会怎么做吗?您需要使用什么命令来执行此操作,等等。?(听起来好像没有,但我不清楚问题是如何做到这一点,还是如何让makefile正确地做到这一点。)@shawna你可以看到流视频(请原谅任何咒骂)()
    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