使用Poky进行交叉编译
CMake cross compilation with Poky
我尝试用CMake建立我的跨平台开发环境。
当我尝试使用poky工具链编译时,我遇到以下错误:
make[2]: *没有规则使'/opt/poky/1.3/sysroots/armv5te-poky-linux-gnueabi/usr/lib/libboost_thread。So ',被test需要。停止
我试着用两种不同的方法设置CMake工具链,结果是相同的。
Method1(简单):
###################################################################################
# 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)
Method2:
# 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;
}
提前感谢您的帮助
我的问题的解决方案:
Solution1:
###################################################################################
#
# 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} )
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} )
澄清:消息"no rule to make"通常意味着目标文件不存在。大多数时候我手动检查文件。如果文件存在,但仍然出现错误,可以通过设置链接器标志来尝试手动链接例如:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -l${PATH_TO_LIBRARY}")
如果仍然不起作用,则调用带有Verbose标志(通常为Verbose =1)的make,并查看链接步骤是否正确执行。
链接外部库的一般方法是将其作为自己的目标添加。其优点是您可以在同一项目中的多个可执行文件或库中重用它。你不会把它用于boost,因为它们通常会为你处理。
add_library( libABCDEFG SHARED/STATIC IMPORTED )
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${PathToLibrary} )
TARGET_LINK_LIBRARIES(test libABCDEFG)
另一个使用工具链的提示:
工具链仅在项目的第一次创建时包含(除非您以其他方式包含它)。如果你改变了工具链中的任何设置,你必须删除CMake缓存并重新执行第一个CMake调用。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 用于交叉编译和CMake的预处理器宏的单元测试
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- 如何使用导出的函数交叉编译 DLL
- 交叉编译:特殊的交叉编译器还是只是带有选项 -march 的 gcc?
- 交叉编译时包括外部库
- 如何交叉编译C++文件
- SFML 交叉编译 for Windows on Linux.
- 使用 cmake 交叉编译 libwebsockets
- 使用cmake交叉编译gRPC
- 为什么Qt必须从源代码构建以进行交叉编译?
- 交叉编译树莓派
- Microsoft Visual Studio 2019交叉编译CMake库 - 有效,但存在SEG错误
- Jlibfprint 交叉编译
- 在Linux上交叉编译Windows应用程序时如何链接到Winsock?
- GPS 的交叉编译显示"unrecognized option"
- clang 交叉编译命令找不到头文件
- Visual Studio 2017 ARM 交叉编译链接器崩溃
- 使用Poky进行交叉编译