使用静态库(.a)中的头文件(.h)

时间:2017-11-15 17:57:32

标签: android c++ cmake static-libraries

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

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

#include

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

Binary file libtest.a matches

然而,当我在Android-Studio中运行应用程序时,我得到了:

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
              )

我要像这样导入C:

Fatal error: 'example.h' file not found

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

2 个答案:

答案 0 :(得分:1)

静态库文件(Windows上的Unix / Linux .a上的.lib)通常包含标题。是的,从技术上讲,可以在目标文件中打包任意文件,但大多数链接器只会扼杀它并拒绝在出现这种令人厌恶的情况时去工作。

在归档文件中搜索标题名称时最可能的原因是,头文件名是调试元数据的一部分(调试器可以将二进制位置转换为源文件位置)

您必须单独安装标头,并在编译为附加包含目录时指定安装位置。

答案 1 :(得分:0)

要使用库,您需要两件事:库的编译代码(在.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",当您链接可执行文件时,您需要链接到库中已编译的代码。