我试图为使用Boost库的代码创建一个CMake项目。我想为Android构建它,我正在使用这个项目作为参考:https://code.google.com/p/android-cmake/。
我想使用我以前为android构建的Boost静态库,而不是让它们成为编译项目的一部分。
这是我使用Boost的项目部件的CMakeLists.txt
#BOOST
set(BOOST_ROOT /home/neb/workspace/SDLActivityCMAKE/jni/boost)
set(Boost_INCLUDE_DIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53)
set(BOOST_INCLUDEDIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53)
set(Boost_LIBRARY_DIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib)
set(BOOST_LIBRARYDIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib)
set(Boost_USE_STATIC_LIBS ON)
set(USE_STATIC_BOOST ON)
set(Boost_USE_STATIC_RUNTIME ON)
set(BOOST_COMPILER gcc)
find_package(Boost COMPONENTS "thread-gcc-mt-1_53" "date_time-gcc-mt-1_53" REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
#BOOSTEND
add_executable(main main.cpp)
target_link_libraries( main ${Boost_LIBRARIES} )当我运行常规的cmake命令(cmake ..从android项目中jni文件夹的子目录中运行)时,没有问题,cmake查找库。当我让cmake使用上面提到的项目提供的android.toolchain.cmake时,我得到了这个(我在使用-DBoost_DEBUG选项)。
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:566 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46;1.45.0;1.45;1.44.0;1.44;1.43.0;1.43;1.42.0;1.42;1.41.0;1.41;1.40.0;1.40;1.39.0;1.39;1.38.0;1.38;1.37.0;1.37;1.36.1;1.36.0;1.36;1.35.1;1.35.0;1.35;1.34.1;1.34.0;1.34;1.33.1;1.33.0;1.33
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:568 ] Boost_USE_MULTITHREADED = TRUE
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:570 ] Boost_USE_STATIC_LIBS = ON
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:572 ] Boost_USE_STATIC_RUNTIME = ON
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:574 ] Boost_ADDITIONAL_VERSIONS =
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:576 ] Boost_NO_SYSTEM_PATHS =
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:644 ] Declared as CMake or Environmental Variables:
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:646 ] BOOST_ROOT = /home/neb/workspace/SDLActivityCMAKE/jni/boost
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:648 ] BOOST_INCLUDEDIR = /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:650 ] BOOST_LIBRARYDIR = /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:652 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46;1.45.0;1.45;1.44.0;1.44;1.43.0;1.43;1.42.0;1.42;1.41.0;1.41;1.40.0;1.40;1.39.0;1.39;1.38.0;1.38;1.37.0;1.37;1.36.1;1.36.0;1.36;1.35.1;1.35.0;1.35;1.34.1;1.34.0;1.34;1.33.1;1.33.0;1.33
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:734 ] location of version.hpp: /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/boost/version.hpp
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:754 ] version.hpp reveals boost 1.53.0
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:786 ] guessed _boost_COMPILER = -gcc46
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:796 ] _boost_MULTITHREADED = -mt
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:839 ] _boost_RELEASE_ABI_TAG = -s
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:841 ] _boost_DEBUG_ABI_TAG = -sd
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:884 ] _boost_LIBRARY_SEARCH_DIRS = /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/stage/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/../lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/stage/lib;C:/boost/lib;C:/boost;/boost/boost_1_53_0/lib;/boost/boost_1_53/lib;/boost/lib;/boost;/sw/local/lib
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:962 ] Searching for THREAD-GCC-MT-1_53_LIBRARY_RELEASE: boost_thread-gcc-mt-1_53-gcc46-mt-s-1_53;boost_thread-gcc-mt-1_53-gcc46-mt-s;boost_thread-gcc-mt-1_53-mt-s-1_53;boost_thread-gcc-mt-1_53-mt-s;boost_thread-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:994 ] Searching for THREAD-GCC-MT-1_53_LIBRARY_DEBUG: boost_thread-gcc-mt-1_53-gcc46-mt-sd-1_53;boost_thread-gcc-mt-1_53-gcc46-mt-sd;boost_thread-gcc-mt-1_53-mt-sd-1_53;boost_thread-gcc-mt-1_53-mt-sd;boost_thread-gcc-mt-1_53-mt;boost_thread-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:962 ] Searching for DATE_TIME-GCC-MT-1_53_LIBRARY_RELEASE: boost_date_time-gcc-mt-1_53-gcc46-mt-s-1_53;boost_date_time-gcc-mt-1_53-gcc46-mt-s;boost_date_time-gcc-mt-1_53-mt-s-1_53;boost_date_time-gcc-mt-1_53-mt-s;boost_date_time-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:994 ] Searching for DATE_TIME-GCC-MT-1_53_LIBRARY_DEBUG: boost_date_time-gcc-mt-1_53-gcc46-mt-sd-1_53;boost_date_time-gcc-mt-1_53-gcc46-mt-sd;boost_date_time-gcc-mt-1_53-mt-sd-1_53;boost_date_time-gcc-mt-1_53-mt-sd;boost_date_time-gcc-mt-1_53-mt;boost_date_time-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:1108 ] Boost_FOUND = FALSE
CMake Error at /usr/share/cmake-2.8/Modules/FindBoost.cmake:1195 (message):
Unable to find the requested Boost libraries.
Boost version: 1.53.0
Boost include path:
/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53
The following Boost libraries could not be found:
boost_thread-gcc-mt-1_53
boost_date_time-gcc-mt-1_53
No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the
directory containing Boost libraries or BOOST_ROOT to the location of
Boost.
Call Stack (most recent call first):
src/CMakeLists.txt:15 (find_package)
-- Configuring incomplete, errors occurred!因此,我看到CMake正在这个精确的目录中搜索库:/home/neb/workspace/SDLActivityCMAKE/jni/boost/lib,其中包含编译的静态库:
neb@neb-VirtualBox:~/workspace/SDLActivityCMAKE/jni/boost/lib$ ls -l
total 24440
-rwxrwxrwx 1 neb neb 557190 sie 27 12:36 libboost_date_time-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 1348474 sie 27 12:36 libboost_filesystem-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 827216 sie 27 12:36 libboost_iostreams-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 6813972 sie 27 12:36 libboost_program_options-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 12927086 sie 27 12:37 libboost_regex-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 1197696 sie 27 12:37 libboost_signals-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 159462 sie 27 12:36 libboost_system-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 1177994 sie 27 12:37 libboost_thread-gcc-mt-1_53.a`我设置指向我能找到的BOOST目录的所有变量,设置变量,说明Boost库应该是静态的,但是它仍然找不到它们。我还能做什么?
发布于 2016-10-14 10:05:55
利用CMake查找Boost
首先,我要说,让CMake找到助推器是很困难的,因为FindBoost.cmake中的automagic会咬你,而KitWare -- CMake的制造者--拥有我所见过的任何流行项目中最糟糕的文档。如果FindBoost.cmake失败,您必须遍历它的源代码来调试它。
交叉编译Boost
您安装的跨编译boost目录如下所示,假设为1.62.0
boost-arm-build/include
boost-arm-build/include/boost-1_62
boost-arm-build/lib从Project目录调用CMake
cmake \
-DBoost_NO_SYSTEM_PATHS=TRUE \
-DBoost_ADDITIONAL_VERSIONS="1.62" \
-DCMAKE_TOOLCHAIN_FILE=../android.toolchain \
-DBOOST_ROOT="../boost-arm-build" \
../Project/-DBoost_ADDITIONAL_VERSIONS - CMake使用硬编码的字符串列表查找Boost,如果您的CMake比您正在构建的Boost版本更早,它将不知道在include目录中查找哪里,因此需要传递它。虽然版本实际上是1.62.0,但是boost将包含放在boost-1_62中,所以我使用了1.62。在FindBoost.cmake中,您会发现每个版本都添加了两次,就像"1.62.0“中的"1.62”就是因为这个原因。
您还应该检查您构建的库的文件名,在我的示例中,让我们看看system
libboost_system-gcc-mt-1_62.a
libboost_system-gcc-mt-1_62.so # Symbolic link to libboost_system-gcc-mt-1_62.so.1.62.0
libboost_system-gcc-mt-1_62.so.1.62.0
libboost_system-gcc-mt-d-1_62.a
libboost_system-gcc-mt-d-1_62.so # Symbolic link to libboost_system-gcc-mt-d-1_62.so.1.62.0
libboost_system-gcc-mt-d-1_62.so.1.62.0gcc -使用的编译器mt -多线程d -调试1_62 -显然是boost的版本如果您看到的是libboost_system.a,这意味着您未能使用--with-layout=versioned构建boost,并且可能应该查看我的因此,关于使用NDK构建助推器的答案。如果您看到的是clang而不是gcc,那么使用clang构建boost是很好的,但是您可能需要告诉CMake使用Boost_COMPILER标志存在clang。
-DBoost_COMPILER="-clang"android.toolchain文件
set(CMAKE_SYSTEM_NAME Android)
set(CROSS_COMPILER_DIR /opt/ndk-R13-standalone)
set(CMAKE_C_COMPILER ${CROSS_COMPILER_DIR}/bin/arm-linux-androideabi-gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILER_DIR}/bin/arm-linux-androideabi-g++)
set(ANDROID_NATIVE_API_LEVEL android-19)
set(ANDROID_ABI armeabi-v7a)
set(ANDROID_STL gnustl_static)
set(CMAKE_SYSROOT ${CROSS_COMPILER_DIR}/sysroot)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
# search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)发布于 2013-12-09 17:06:51
我也有过同样的问题。用find_host_package(Boost COMPONENTS ..)代替find_package(Boost COMPONENTS ..)解决了我的问题。
(在此发现:http://code.google.com/p/android-cmake/issues/detail?id=16)
发布于 2013-09-10 12:42:44
这里有几个问题。
看起来您的boost库是在没有runtime-link=static的情况下构建的,他们没有静态地链接到C++标准库。如果是的话,他们的名字的后缀应该包含一个s (参见促进库命名的文档)
另一个问题是,CMake的FindBoost module希望COMPONENTS参数的形式是"date_time“、”线程“,而不是您提供的全名。
另一个次要的问题是,您不应该设置Boost_INCLUDE_DIR或Boost_LIBRARY_DIR;如果成功,这些设置将由CMake模块设置。设置它们不应造成任何问题,但这只是不必要的混乱。
另外,对于BOOST_ROOT、BOOST_INCLUDEDIR和BOOST_LIBRARYDIR,通常使用-D选项通过命令行设置这些变量,或者将其设置为环境变量,以避免将特定于机器的硬编码路径输入CMakeLists.txt。
最后一点是,您应该删除link_directories调用。它自己的文档阻止了它的使用,并且不需要它,因为您已经在target_link_libraries调用中传递到boost库的全部路径。
因此,最终版本应该更像:
#BOOST
set(Boost_USE_STATIC_LIBS ON)
set(USE_STATIC_BOOST ON) # Not sure if you really need this later. If not, delete.
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_COMPILER -gcc)
find_package(Boost COMPONENTS thread date_time REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
#BOOSTEND
add_executable(main main.cpp)
target_link_libraries(main ${Boost_LIBRARIES})您可以像这样调用CMake:
cmake . -DBOOST_ROOT=<path to root> -DBOOST_INCLUDEDIR=... -DBOOST_LIBRARYDIR=...https://stackoverflow.com/questions/18715694
复制相似问题