【问题标题】:CMake cross compilation with Poky使用 Poky 进行 CMake 交叉编译
【发布时间】: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


【解决方案1】:

我的问题的解决方案:

解决方案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 /home/sylvain/Share/dev/Dev2M_CMakeCrossCompile/temp/boost $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)

我的 CMake 项目:

cmake_minimum_required( VERSION 2.8.9 )

project ( TEST ) 

set( BOOST_COMPONENTS atomic system thread )

#Very useful to find the source of the problem
#set( Boost_DEBUG on )

#Set the version of gcc in my case that is the source of my problems otherwise the module defines the gcc version of my ubuntu PC
set( Boost_COMPILER "-gcc" )

set( BOOST_ROOT /home/sylvain/Share/dev/Dev2M_CMakeCrossCompile/temp/boost )

find_package( Boost COMPONENTS ${BOOST_COMPONENTS} true )

set( MY_BOOST_LIBRARIES
    ${Boost_ATOMIC_LIBRARY}
    ${Boost_SYSTEM_LIBRARY}
    ${Boost_THREAD_LIBRARY}
)

add_executable( test test.cpp ) 
target_link_libraries( test ${MY_BOOST_LIBRARIES} )

【讨论】:

    【解决方案2】:

    Boost 通常链接如下:

    FIND_PACKAGE( Boost COMPONENTS ${TheLibs} REQUIRED )    
    include_directories(${Boost_INCLUDE_DIR})
    link_directories(${Boost_LIBRARY_DIR})
    
    add_executable(test test.cpp)
    target_link_libraries( test ${Boost_LIBRARIES} )
    

    为了澄清: 消息“没有制定规则”通常意味着目标文件不存在。大多数时候我手动检查文件。如果文件存在并且您仍然遇到错误,您可以尝试通过设置链接器标志手动链接 例如:

    SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -l${PATH_TO_LIBRARY}")
    

    如果仍然无法正常工作,则使用 Verbose 标志(通常为 VERBOSE=1)调用 make 并查看链接步骤是否正确执行。


    链接外部库的一般方法是将其添加为自己的目标。优点是您可以将它重用于同一项目中的多个可执行文件或库。您不会将其用于提升,因为他们通常会为您处理。

    add_library( libABCDEFG SHARED/STATIC IMPORTED )
    set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${PathToLibrary} )
    TARGET_LINK_LIBRARIES(test libABCDEFG)
    

    CMake 使用工具链的另一个提示:

    工具链仅包含在项目的第一次创建中(除非您以其他方式包含它)。如果您更改工具链中的任何设置,您必须删除 CMake 缓存并重新执行第一个 CMake 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-31
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多