坦率地说,我已经无计可施了,我真的需要一个地方休息。在编译时我不断得到一个
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/