繁体   English   中英

GCC链接静态库

[英]GCC linking a static library

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

这是我的$ 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. 您对源路径和目标路径进行了硬编码。 而是使用自动变量( $^$<表示源; $@表示目的地)

  6. 您试图对标头依赖项进行硬编码。 这容易出错,并且弄乱了源规范(您不希望$^在命令行中列出.h文件...)。 而是使用gcc -MM为您生成依赖项!

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

     .depends: $(CXX) -MM $(CXXFLAGS) -c *.cpp > $@ -include .depends 
  7. 保留.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

在一组非常简单的文件示例中,您将获得:

$ 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM