【问题标题】:C++ linking to libraries with makefile (newbe)C++ 使用 makefile (newbe) 链接到库
【发布时间】:2011-04-30 05:19:00
【问题描述】:

我正在尝试了解如何在我的 C++ 项目中使用非标准库。 我有几个问题。

假设我想使用 POCO 库。所以我下载了它并使用make(静态构建)构建它。现在我有一堆 .o 文件和 .h 文件。 不同目录下有一个Path.h文件和一个Path.o文件。

现在我想在我的代码中使用这个模块。所以我使用#include“Poco/Path.h”包含文件。我是否必须修改 makefile 并将 Path.o 添加到我的目标?

当我使用标准库时会发生什么?那些仅在头文件中可用吗?我知道模板代码无法预编译。剩下的呢?

【问题讨论】:

    标签: c++ makefile linker poco-libraries


    【解决方案1】:

    除了 .h 和 .o 文件之外,您可能还会有一个或多个 libXXX.a 和/或 libXXX.so 文件。这些是您的应用程序应该链接的实际库文件。

    要使用该库,您需要在源文件中包含相关的头文件,并更改您的 makefile 以告诉链接器它也应该将您的应用程序链接到 XXX 库。 典型的链接器命令是-lXXX,链接器将同时查找 libXXX.a 和 libXXX.so 并使用看起来最合适的那个。

    标准库与外部库并没有真正的不同,只是您不必向链接器显式指定它。

    【讨论】:

    • 所以 .a 文件是静态库,而 .so 是动态/共享的?
    【解决方案2】:

    您的问题似乎暗示您已经有自己的代码的生成文件。如果是这种情况,那么是的,您应该在该 makefile 中修改可执行文件的规则。正如 Bart van Ingen Schenau 指出的那样,POCO makefile 可能会将对象文件组装到诸如Poco/Libraries/libPoco.a 之类的库中,因此您应该使用它们而不是尝试挑选出您需要的对象文件。例如,如果现在你的规则是:

    foo: foo.o bar.o
        g++ -lSomeLibrary $^ -o $@
    

    你应该改成

    foo: foo.o bar.o
        g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o $@
    

    (你的问题的第二部分,“会发生什么......其余的呢?”我不清楚。)

    注意:#include "Poco/Path.h" 是个坏主意。这使您的代码依赖于目录结构,这是它不应该关心的。最好#include "Path.h" 并告诉编译器在哪里找到它:g++ -c -IPoco ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多