包含Boost库

时间:2017-07-21 11:29:36

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

坦率地说,在我的智慧结束时,我真的需要一个崩溃的地方。在编译时我正在继续获得

  

错误:链接器命令失败,退出代码为1(使用-v查看调用)

我认为这是由于项目构建和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编译的shard和静态库(我的AStudio中的模拟器也被绑定)。

Android Studio
我正在使用Cmake来构建我的项目的C / C ++库。我有几个C libs和一个C ++ lib,彼此依赖。最后一个是使用boost的。由于所有库都是在没有错误的情况下构建和发现的,因此虽然所有C头文件都有预处理器声明,但它似乎是一个名称错误问题:extern C.除了boost部分外,所有部分都运行完美< / p>

CMake的
设置了find_package()REQUIRED参数,Boost_DEBUG告知已找到所有组件。因为在某一点上我得到了错误

  

对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:错误添加符号:文件格式错误

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

1 个答案:

答案 0 :(得分:1)

总结评论:

编译错误&#34; undefined reference to boost::system::generic_category()&#34;可以通过将-DBOOST_SYSTEM_NO_DEPRECATED添加到编译器标志来解决此问题(有关详细信息,请参阅此处:undefined reference to boost::system::system_category() when compiling)。

要将构建限制为仅限x86,您可以在&#34; externalNativeBuild:cmake &#34;中提供abiFilters "x86" cppFlags 旁边的部分。

dlopen()问题:

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

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

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

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

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

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