【发布时间】:2015-08-26 05:27:42
【问题描述】:
过去两个小时我一直在网上研究这个问题,但无济于事 - 我已多次按照所有说明进行操作。
我正在使用 C++11、GCC、Ubuntu 15.04 和 Code::Blocks 13.12。
我正在创建一个自定义静态库。目前,它只包含两个文件:iochannel.hpp 和 iochannel.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"
据我所知,网上绝对没有比我已经遵循的更多的说明了。
这在理论上是一件微不足道的事情,但我很难过。谁能帮我解决这个问题?
编辑:我的文件结构如下。在一个文件夹(实际上是我的项目存储库的根目录)中,我有两个文件夹:pawlib 和 pawlib-test。它包含以下重要文件...
pawlib/bin/Debug/libpawlib.apawlib/src/iochannel.cpppawlib/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