【问题标题】:Custom C++ Static Library Not Linking (Code::Blocks)自定义 C++ 静态库未链接(代码::块)
【发布时间】:2015-08-26 05:27:42
【问题描述】:

过去两个小时我一直在网上研究这个问题,但无济于事 - 我已多次按照所有说明进行操作。

我正在使用 C++11、GCC、Ubuntu 15.04 和 Code::Blocks 13.12。

我正在创建一个自定义静态库。目前,它只包含两个文件:iochannel.hppiochannel.cpp。我编译,一切都很好。在pawlib/bin/Debug 中生成一个libpawlib.a 文件

接下来,在我想要使用静态库的项目中,我进入Project > Build Options...。我将.a 文件的路径添加到Linker settings,并将.a 文件所在的文件夹添加到Search Directories > Compiler> Linker 我已经检查、双重检查、三重检查和四重检查路径。

只要我不尝试从库中导入,该项目的构建就会成功,并且它会运行。但是,无论我如何输入#include 语句,编译时它都会显示“没有这样的文件或目录”。我已经尝试了以下所有(个人)...

#include <iochannel>
#include <iochannel.hpp>
#include <pawlib/iochannel>
#include <pawlib/iochannel.hpp>
#include "iochannel"
#include "iochannel.hpp"
#include "pawlib/iochannel"
#include "pawlib/iochannel.hpp"

据我所知,网上绝对没有比我已经遵循的更多的说明了。

这在理论上是一件微不足道的事情,但我很难过。谁能帮我解决这个问题?

编辑:我的文件结构如下。在一个文件夹(实际上是我的项目存储库的根目录)中,我有两个文件夹:pawlibpawlib-test。它包含以下重要文件...

  • pawlib/bin/Debug/libpawlib.a
  • pawlib/src/iochannel.cpp
  • pawlib/include/iochannel.hpp

pawlib-test 中的项目使用相对路径 ../pawlib/bin/Debug/libpawlib.a../pawlib/bin/Debug,具体取决于它需要文件路径还是目录路径。绝对路径也失败了。我已确认这些路径中存在文件和文件夹。

重要提示:我不应该手动包含 pawlib 的 .hpp 文件,因为这违背了库的全部目的。我经常使用静态库,并且我从不必须将 .hpp 文件或其目录添加到搜索目录中。

gcc 命令及其错误(由 CodeBlocks 产生)如下...

-------------- Build: Debug in pawlib-test (compiler: GNU GCC Compiler)---------------

g++ -std=c++11 -std=c++11 -Wall -g -std=c++11 -g -I../pawlib/bin/Debug -c /home/jason/Code/Repositories/pawlib-git/pawlib-test/main.cpp -o obj/Debug/main.o
/home/jason/Code/Repositories/pawlib-git/pawlib-test/main.cpp:2:31: fatal error: pawlib/iostream.hpp: No such file or directory
 #include "pawlib/iostream.hpp"
                               ^
compilation terminated.
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

编辑 2: 我的错误(部分)...标头通常与静态库分开导入。问题是,几乎没有教程或文档提到这一点。这是“每个人都知道,所以不用说”类型的事情之一。

【问题讨论】:

  • linker 设置将帮助 compiler 找到包含文件。更改您的包含路径,以便编译器可以找到iochannel.hpp,并且正如您已经完成的那样:更改链接器路径,以便链接器可以找到libpawlib.a跨度>
  • 这不会破坏静态库的目的吗?我需要从静态库中导入那个 .hpp。您可以从其他静态库导入 .hpp 文件就好了 - ICU、Glib、gtkmm...
  • "bla.hpp : No such file or directory" 在链接阶段似乎很奇怪。这在编译阶段很常见,只要文件bla.hpp 不在包含搜索路径中。如果main.cpp 位于文件夹src 中,iochannel.hpp 位于文件夹src/pawlib 中,那么#include "pawlib/iochannel.hpp" 应该可以解决问题...您能否发布 CodeBlocks 已运行的 gcc 命令和打印的错误?您能否尝试在 Search Directory > Compiler 中添加 iochannel.hpp 的路径并在代码中添加 #include "iochannel.hpp" 的路径?
  • 我在搜索目录中添加了.hpp 路径,它可以正常工作。我想知道的是……为什么几乎所有的教程都忽略了这个细节?这对于静态库来说是正常的吗? (我只找到了一个几乎没有提到它的...啊。)请作为答案发布,我会接受。

标签: c++ linker static-libraries codeblocks


【解决方案1】:

我对静态库和动态库感到困惑。当您链接到静态库时,您还必须链接到其头文件。这就是为什么您可以在任何 UNIX 机器上同时找到 /usr/lib(用于静态库)和 /usr/include(用于它们的标头)文件夹的原因。

正如 francis 所指出的,这与我没有给出头文件路径的事实有关。如果您使用 CodeBlocks,请转到 Build Options-&gt; Search directories -&gt; Compiler 对话框,然后将路径添加到包含 .h.hpp 文件的文件夹。

现在效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多