【发布时间】:2014-08-22 16:09:41
【问题描述】:
我尝试使用 CMake 设置我的跨平台开发环境。
我只在尝试使用 poky 工具链编译时遇到以下错误:
make[2]: * 没有规则来制作'/opt/poky/1.3/sysroots/armv5te-poky-linux-gnueabi/usr/lib/libboost_thread.so','需要'测试'。停止
我尝试用两种不同的方法设置CMake工具链,结果是一样的。
方法1(简单):
###################################################################################
# Cross compile using Poky prebuilt toolchains, you need to source the
# environment first:
#
# $ rm -fr build; mkdir build; cd build
# $ source /opt/poky/1.3/environment-setup-armv5te-poky-linux-gnueabi
# $ cmake -DCMAKE_TOOLCHAIN_FILE=Toolchains/arm-poky-linux-gnueabi-simple.cmake
# $ make
###################################################################################
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
方法二:
# this one is important
SET( CMAKE_SYSTEM_NAME Linux )
# this one not so much
SET( CMAKE_SYSTEM_VERSION 1 )
# specify the cross compiler
SET( CROSS_COMPILER_PATH /opt/poky/1.3/sysroots/x86_64-pokysdk-linux/usr/bin/armv5te-poky-linux-gnueabi )
SET( C_CROSS_COMPILER arm-poky-linux-gnueabi- )
FIND_PROGRAM( CCACHE ccache )
IF( CCACHE )
SET( CMAKE_C_COMPILER "${CCACHE}" "${CROSS_COMPILER_PATH}/${C_CROSS_COMPILER}gcc" )
SET( CMAKE_CXX_COMPILER "${CCACHE}" "${CROSS_COMPILER_PATH}/${C_CROSS_COMPILER}g++" )
ELSE( CCACHE )
SET( CMAKE_C_COMPILER "${CROSS_COMPILER_PATH}/${C_CROSS_COMPILER}gcc" "" )
SET( CMAKE_CXX_COMPILER "${CROSS_COMPILER_PATH}/${C_CROSS_COMPILER}g++" "" )
ENDIF(CCACHE)
SET( CMAKE_RANLIB "${CROSS_COMPILER_PATH}/${C_CROSS_COMPILER}ranlib" )
SET( CMAKE_AR "${CROSS_COMPILER_PATH}/${C_CROSS_COMPILER}ar" )
SET( CMAKE_COMPILER_IS_GNUCC 1 )
SET( CMAKE_COMPILER_IS_GNUCXX 1 )
INCLUDE_DIRECTORIES( BEFORE SYSTEM /opt/poky/1.3/sysroots/armv5te-poky-linux-gnueabi/usr/include )
LINK_DIRECTORIES( /opt/poky/1.3/sysroots/armv5te-poky-linux-gnueabi/usr/lib )
# where is the target environment
SET( CMAKE_FIND_ROOT_PATH /opt/poky/1.3/sysroots/armv5te-poky-linux-gnueabi/ )
#search for libraries and header files only in the target environment
SET( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
SET( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
# search for programs in the build host directories
SET( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
我的 CMake 项目是:
cmake_minimum_required( VERSION 2.8.9 )
project ( TEST )
set( BOOST_COMPONENTS thread )
find_package( Boost COMPONENTS ${BOOST_COMPONENTS} )
add_executable( test test.cpp )
target_link_libraries( test ${Boost_THREAD_LIBRARY} )
我用于测试的 cpp 代码:
#include <boost/thread/thread.hpp>
#include <iostream>
void hello()
{
std::cout << "Hello!" << std::endl;
}
int main()
{
boost::thread thrd( &hello );
thrd.join();
return 0;
}
提前感谢您的帮助
【问题讨论】:
-
您是否先构建了 Boost.Thread 库?
-
当然可以。我什至可以使用标准 Makefile 进行编译
-
也许:
link_directories(${Boost_LIBRARY_DIR})并删除set( Boost_REALPATH on )? -
这只是一个测试,没有问题是一样的。
-
但是你只设置链接目录为
/opt/poky/1.3/sysroots...,${Boost_LIBRARY_DIR}呢?
标签: c++ boost cmake arm cross-platform