【问题标题】:Can't link a static binary to #include it无法将静态二进制文件链接到#include
【发布时间】:2019-11-09 22:13:45
【问题描述】:

早安,

我有一个我正在尝试编译的文件,其中包含一个静态链接二进制文件的#include。

#!/bin/bash

g++ -Wall -std=c++17 Message.cpp ../textmagic-rest-cpp/lib/libtextmagic.a

我收到以下错误:致命错误:libtextmagic.h:没有这样的文件或目录

假设当前工作目录是调用/运行脚本的目录,我提供的相对路径是正确的。我可能错误地链接了二进制文件,我在互联网上搜索过,但其他帖子/资源对我没有帮助。

请注意,该脚本与Message.cpp 在同一目录中运行。

【问题讨论】:

标签: c++ linker g++


【解决方案1】:

g++-I-L 标志可以为你做这件事。您的标志将如下所示:-I/ThePathToYourHeaders-L/ThePathToYourLib。我不知道g++ 是否支持那里的相对路径,但绝对路径保证在那里工作。

您可能还需要添加链接器标志。对于您的项目,它将是-ltextmagic。它只是您要链接的.a 文件的名称,文件名前没有lib

【讨论】:

  • 谢谢,所以想... -I../textmagic-rest-cpp/include/textmagic.h -L../textmagic-rest-cpp/lib -ltextmagic.h在正确的路径上(假设相对路径有效)? -I 是包含的路径,-L 是 .a 库文件的路径?
  • @ChrisTurgeon 不,标题的文件名不应包含在 -I 选项中,只有路径(假设您仅在 #include 中通过文件名引用它)。 -l 选项应引用不带.a 且不带前导lib 的库名称,即-lextmagic,而不是标头名称。
  • 所以首先使用-I-L 标志,通常使用包含库的路径而不是单独使用每个文件,这确实可以使您的编译命令保持简短。所以对你来说,它应该看起来像这样:`-I../textmagic-rest-cpp/include` 和`-L../textmagic-rest-cpp/lib. With the linker flags, you only need to link to each .a` 文件,而不是标题。同样正如我所说,因为您的.a 文件名为libtextmagic.a,所以您需要删除开头的lib 和最后的.a,从而产生-ltextmagic。这里也没有路径,只有文件名。
  • @uneven_mark 非常感谢你们!这解决了我的问题,我学到了很多关于 g++ 和这个库的东西。干杯!
  • @ChrisTurgeon 顺便说一句。这些标志几乎适用于任何编译器。
【解决方案2】:

#include 指令需要“读取”您作为参数提供的头文件,而该头文件不包含在静态库中。

您可以使用源文件的相对路径包含在内,也可以使用 -I 参数将头文件的位置传递给编译器。

【讨论】:

  • 您错过了链接器标志和-L 标志
  • @user11914177 链接器标志虽然可能需要,但与问题中关于缺少标头的问题没有直接关系。
  • 但这将是下一个问题
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2015-04-02
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多