【问题标题】:Use header file (.h) from a static library (.a)使用静态库 (.a) 中的头文件 (.h)
【发布时间】:2017-11-15 17:57:32
【问题描述】:

我正在尝试在另一个项目中使用静态库 (.a)。我想从这个.a 中创建一个标题的#include,但我有错误。

首先,我尝试在 .a 文件中搜索 .h 文件,以了解它是否存在于 .a 下,我得到:

Binary file libtest.a matches

所以,静态库下的标题。然后,我以这种方式插入到 CMakeFiles.txt 中:

cmake_minimum_required(VERSION 3.4.1)

add_library(hello-jni SHARED
            hello-jni.c)

# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
                      android
                      log
                     /home/prvs/android-ndk/hello/jni/app/src/main/cpp/libtest.a
              )

但是,当我在 Android-Studio 中运行该应用时,我得到了:

Fatal error: 'example.h' file not found

我正在像这样导入到 C 中:

#include <example.h>

为了导入头文件,还需要其他步骤吗?

【问题讨论】:

  • 您必须在项目的包含目录列表中设置标题的目录。

标签: android c++ cmake static-libraries


【解决方案1】:

静态库文件(Unix/Linux 上的.a Windows 上的.lib)通常包含标题。是的,从技术上讲,可以将任意文件与目标文件一起打包,但大多数链接器会对此感到窒息,并在遇到这种可憎的情况时拒绝工作。

在存档匹配中搜索头文件名时,最可能的原因是头文件名是作为库的一部分的调试元数据的一部分(以便调试器可以将二进制位置转换为源文件位置) .

需要单独安装头文件,编译时指定安装位置为附加包含目录。

【讨论】:

    【解决方案2】:

    要使用库,您需要两件事:库的编译代码(在 .a 文件、.so 文件、.lib 文件或其他文件中),以及单独描述入口点的头文件图书馆。一般来说,您不能从库中派生标头。

    例如,要使用 C++ 标准库(作为某种形式的库文件随编译器一起提供),您可以使用标准头文件,其名称类似于“iostream”、“string”等。

    例如,如果您的库包含来自一个源文件的编译代码:

    // source.cpp
    #include <iostream>
    void f(int i) {
        std::cout << i << '\n';
    }
    

    您需要一个描述该入口点的头文件:

    // mylibrary.h
    void f(int i);
    

    在每个调用f 的源文件中,您需要#include "mylibrary.h",并且当您链接可执行文件时,您需要链接库中的已编译代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 2014-01-15
      • 2020-07-07
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多