c++ - 包含 Boost 库时 Android Studio 链接器命令失败

标签 c++ android-studio boost android-ndk cmake

坦率地说,我已经无计可施了,我真的需要一个地方休息。在编译时我不断得到一个

error: linker command failed with exit code 1 (use -v to see invocation)

我认为这是由于项目构建和 boost 库之间的不兼容性或编译器版本不同,但只要我阅读二进制文件就完全兼容(?)。

建筑 boost
我在 Windows 10 上通过 MinGW 进行了编译,但为了排除此处的错误,我最终使用 this git shell script 构建了 boost它适用于最新版本的 Boost (1.64.0) 和 NDK (r15b)。我是在带有 Ubuntu 16.04 的 VirtualBox 中完成的,因为我没有足够的知识来适应 Windows 10(至少我不能)。现在我有使用 gnu-4.9 和 llvm-3.5 为 x86 编译的分片和静态库(我在 AStudio 中的模拟器也使用了它)。

安卓工作室
我正在使用 Cmake 来构建我的项目的 C/C++ 库。我有几个相互依赖的 C 库和一个 C++ 库。最后一种是使用 boost 的。由于 所有 库的构建和发现都没有错误,这对我来说似乎是一个名称修改问题,尽管所有 C 头文件都有预处理器声明:extern C。除了 boost 部分外,所有运行都完美

CMake
设置了 find_package() REQUIRED 参数并且 Boost_DEBUG 告诉所有组件都已找到。因为在某个时候我得到了错误

undefined reference to boost::system::generic_category()

我将系统添加到组件中,因此我的简约组件设置仅包含计时和系统,就像在许多其他与此特定问题相关的线程中所建议的那样。我尝试单独链接 boost 库,但没有成功:

target_link_libraries( MyLib ${Boost_SYSTEM_LIBRARY} 
                                            ${Boost_CHRONO_LIBRARY}
                                            )

但现在我遇到了上述问题,此时我正在举起休战旗。每一个提示都非常感谢!非常感谢您!

CMakeLists.txt

set( Boost_DEBUG ON )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_USE_STATIC_RUNTIME ON )
set( Boost_USE_MULTITHREADED OFF )
set( Boost_NO_SYSTEM_PATHS ON )
set( BOOST_ALL_DYN_LINK OFF )

set( BOOST_ROOT C:/MyBoost )
set( Boost_INCLUDE_DIR ${BOOST_ROOT}/include )
set( Boost_LIBRARY_DIR ${BOOST_ROOT}/lib )
set( Boost_Version 1.64.0 )

find_package( Boost ${Boost_Version} COMPONENTS system chrono )
if( Boost_FOUND )
    target_include_directories( MyLib PUBLIC/PRIVATE ${Boost_INCLUDE_DIR} )    
    link_directories( ${Boost_LIBRARY_DIR} )
endif()
target_link_libraries( MyLib ${Boost_LIBRARIES} )

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "My_ID"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}

=====更新=====

我加了

externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions -DBOOST_SYSTEM_NO_DEPRECATED"
            }

到 build.gradle 文件,现在它按预期编译,甚至包括线程或计时库!尽管我之前取消注释的一些命令现在仍然无法使用。我现在收到以下错误:

libboost_chrono.a: error adding symbols: File in wrong format

这应该是apk和boost libs的版本问题??!如果是这样,如何确保我使用的是正确的 Boost 版本?

最佳答案

总结评论:

编译错误“undefined reference to boost::system::generic_category()”可以通过添加 -DBOOST_SYSTEM_NO_DEPRECATED 来解决到编译器标志(更多详细信息请参见此处:undefined reference to boost::system::system_category() when compiling)。

要将构建限制为 x86,您可以提供 abiFilters "x86"cppFlags 旁边的“externalNativeBuild:cmake”部分。

dlopen()问题:

当动态链接库时,它也需要在共享库搜索路径中,否则在实际运行可执行文件时可能找不到。所以 Boost 共享库路径需要放在 PATH 中(Windows) 或 LD_LIBRARY_PATH (Linux)(如果它不在标准位置,如“/lib[64]”或“/usr/local/lib[64]”)。

或者,您可以使用静态库来构建:

set(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED ...)

另一种方法是在安装步骤中将 Boost 库位置添加到 RPATH:

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

(但这可能不适合发布版本,因为它修复了库位置,它可能位于目标机器上的不同位置)

关于c++ - 包含 Boost 库时 Android Studio 链接器命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45236535/

相关文章:

c++ - SFML TCP 套接字发送导致滞后峰值

android-studio - 合并 Intellij IDE 以仅安装一个

java - 使用 Android Studio 3.1 和 gradle 3.1.0 构建项目时出错

c++ - Boost::asio get_io_service() 在 boost 1.70+ 中的替代方案

c++ - 将超时设置为 recv 函数

C++结构中数组的初始化

c++ - 覆盖具有不同返回类型的虚函数会引发私有(private)继承错误

java - Android Studio 错误 :Error:(23, 0) 找不到根项目参数的方法 android()

c++ - boost 1.69 Visual Studio 2017 64 位

c++ - Boost::MPL Vector 和 For_Each:如何将 avector 打印为元组?