在安卓上编译需要 stl 的库



我正在尝试使用 android ndk 为 android 模拟器的 x86 发行版构建一个库。该库使用 scons 进行构建,并具有一堆 stl 和 boost 依赖项。到目前为止,我已经将 --cxx 和 --cc 设置为 android 工具链附带的编译器,并将 gcc 的系统根设置为 ndk 附带的平台特定根。

现在,我收到错误,例如错误:ctime:没有这样的文件或目录等。我看到 stl 库的 android ndk 中有 .a 和 .so 文件,我如何要求 scons/编译器链接到这些文件?

您必须配置库路径,这是传递给编译器的传统"-L"标志,在本例中为 gcc。(你应该使用g++而不是gcc吗?

这是通过设置 LIBPATH SCons 构造变量来完成的,如此处所述。请注意,SCons 以可移植的方式执行此操作,因此无需在路径中指定-L。 以下是我通常如何执行此操作的摘录:

libPaths = [
    '/pathToNDK/build/cxx-stl/gnu-libstdc++/lib',
    '/anotherLibPath',
    '/and/yet/another'
]
includePaths = [
    '/pathToNDK/build/cxx-stl/gnu-libstdc++/include',
    '/anotherIncludePath',
    '/and/yet/another/include'
]
env.Append(LIBPATH = libPaths, CPPPATH = includePaths)
env.Library(target='yourTarget', source = 'sourceFile.cc')
env.Program(target='yourBinary', source = 'yourSource')

请注意,我还介绍了如何指定包含路径(传递给编译器的传统"-I"标志)。这会将指定的包含和库路径追加到环境中。如果不想追加,请改用env.Replace()。现在,同一环境上的所有构建器都将使用这些路径,在此示例中,Library()Program()构建器都将使用指定的路径。

此外,如果您要使用的路径位于项目目录中(在 SConstruct 的同一目录或子目录中),则无需使用完整的绝对路径,但可以在前面加上"#"并指定相对于根级别 SConstruct 的路径。

相关内容

最新更新