代码之家  ›  专栏  ›  技术社区  ›  CodeMouse92

自定义C++静态库不链接(代码::块)

  •  1
  • CodeMouse92  · 技术社区  · 10 年前

    过去两个小时,我一直在网上研究这个问题,但都没有结果——我已经多次遵循所有的指示。

    我使用的是C++11、GCC、Ubuntu 15.04和代码::块13.12。

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

    接下来,在我想要的项目中 使用 静态库,我进入 Project > Build Options... .I将.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"
    

    据我所知,网上没有比我已经学过的更多的指导了。

    这是一件理论上微不足道的事情,但我被难住了。有人能帮我把它弄好吗?

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

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

    中的项目 棘爪试验 正在使用相对路径 ../pawlib/bin/Debug/libpawlib.a ../pawlib/bin/Debug ,这取决于它需要文件还是目录路径。绝对路径也会失败。我已经确认这些路径上存在文件和文件夹。

    重要: 我不必手动包含paulib的.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: 我的错误(部分)…标头通常是从静态库中单独导入的。问题是,几乎没有教程或文档提到这一点。这是“每个人都知道,所以不用说”类型的事情之一。

    1 回复  |  直到 10 年前
        1
  •  1
  •   CodeMouse92    10 年前

    我混淆了静态库和动态库。链接到静态库时,还必须链接到其头文件。这就是为什么你会发现 /usr/lib (对于静态库)和 /usr/include (用于其标题)文件夹。

    正如francis指出的,这与我没有给出头文件的路径有关。如果您使用CodeBlocks,请转到 Build Options-> Search directories -> Compiler 对话框,并使用 .h .hpp 文件夹。

    现在它工作得很好。