【问题标题】:makefiles and linking a library in a different folder生成文件并链接不同文件夹中的库
【发布时间】:2011-10-06 23:58:55
【问题描述】:

我在 StackOverflow 上进行了一些搜索并尝试了一些建议,但到目前为止还没有解决问题。

我正在为一个学校项目制作一个 makefile,作为我项目的一部分,我正在生成一个静态库并链接它。编译器在到达静态库中包含的标头时会引发错误。代码就是#include "StringUtil.h"

所以在makefile中我有这些相关的代码部分

LINKFLAGS=-Llib/ -lHTMLtools

bin : lib $(BIN_FILE)
lib : $(LIB_OBJ_FILES)
    ar r lib/libHTMLtools.a $(LIB_OBJ_FILES)

$(BIN_FILE) : $(OBJ_FILES) #This is only obj/crawler.o for now
    g++ -o bin/crawler obj/crawler.o
obj/crawler.o : src/crawler.cpp inc/crawler.h
    g++ -c -static $(LINKFLAGS) -o obj/crawler.o -I inc src/crawler.cpp

所以每当我运行make bin 命令时,它都会按预期生成lib.libHTMLtools.a,但是当它到达
g++ -c -static $(LINKFLAGS) -o obj/crawler.o -I inc src/crawler.cpp
它返回此错误的行。

src/crawler.cpp:2:24: fatal error: StringUtil.h: No such file or directory compilation terminated.

任何帮助或建议将不胜感激!

【问题讨论】:

  • 您的 StringUtil.h 文件在哪里?如果它不在“inc”目录中,它不会找到它
  • 它是我构建的库的一部分。但如果在到期之前找不到其他方法,我总是可以从 utils/inc/StringUtil.h 中引用它
  • @bob 当您说它是您构建的库的一部分时,您的意思是在构建静态库时将头文件复制到特定的输出目录吗?您还可以添加源代码和二进制输出的目录结构吗?
  • no :/ 我认为它们不会被复制...应该吗?我只是想象 .h 文件被捆绑在 .a 文件中......
  • @bob 不,它不是这样工作的。详情请查看疯狂的答案。

标签: c++ makefile static-libraries


【解决方案1】:

在 C++ 中,库文件是不够的。它们在编译源代码时不使用,而仅在链接时使用。要编译源文件,您需要包含头文件。但是编译器需要知道在哪里可以找到它。尝试像这样在最后一行添加-I utils/inc

g++ -c -static $(LINKFLAGS) -o obj/crawler.o -I inc -I utils/inc src/crawler.cpp

【讨论】:

  • 然后...哦...是的,成功了!谢谢!那么为什么不能从库中引用 .h 文件呢?这会让生活变得更轻松,不是吗?
  • C 和 C++ 就是这样制作的。他们用 Java 和 C#(等等)修复它。这是我们需要忍受的遗产;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2020-12-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
相关资源
最近更新 更多