cmake交叉编译个人工程模板
初衷
由于目前写的一些c/c++程序需要考虑跨平台,并且我目前接触的主要是cmake,并且比较常见交叉编译方式,所以这里总结了一个个人比较常用的交叉编译模板,后续一些工程可以拿来直接修改使用,算是比较方便,防止长时间不接触cmake又忘记了。
此外,建议CSDN的markdown支持一下cmake的高亮!
1、主目录模板1
# 指定最小需要的cmake版本
cmake_minimum_required(VERSION 3.0)
# 工程名,一般使用大的文件夹的名字
project(CROSS_TEST)
# 设置交叉编译工具链
set(CMAKE_C_COMPILER /usr/local/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc)
# 设置c_flags
set(CMAKE_C_FLAGS "--sysroot=/usr/local/android-ndk-r10/platforms/android-18/arch-arm/ -pie -pipe -Os")
# 设置头文件位置
include_directories(
/usr/local/android-ndk-r10/platforms/android-18/arch-arm/usr/include/
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include/
${PROJECT_SOURCE_DIR}/include/cjson/
${PROJECT_SOURCE_DIR}/include/curl/
${PROJECT_SOURCE_DIR}/include/json/
${PROJECT_SOURCE_DIR}/include/libxml/
${PROJECT_SOURCE_DIR}/include/lua/
${PROJECT_SOURCE_DIR}/include/openssl/
${PROJECT_SOURCE_DIR}/include/pcap/
)
# 设置链接动态库或者静态库的位置
link_directories(
/usr/local/android-ndk-r10/platforms/android-18/arch-arm/usr/lib/
${PROJECT_SOURCE_DIR}/lib
)
# 设置源码目录
aux_source_directory(. DIR_CROSS_TEST)
# 设置可执行程序名
add_executable(ky_stb ${DIR_CROSS_TEST})
# 设置链接的库
target_link_libraries(test log dl m c crypto ssl xml2 curl pcap cutils cjson)
# 指定可执行程序的安装位置,即make install后安装执行程序的位置
install(TARGETS test RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/../bin)
2、主目录模板2(有支持子目录的功能)
cmake_minimum_required(VERSION 2.8)
project(21CN_client)
set(CMAKE_INSTALL_PREFIX /home/zy/work_dir/21CN_device_management_client/bin)
set(CMAKE_C_COMPILER /opt/mstar_glibc_host/bin/arm-mstar-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /opt/mstar_glibc_host/bin/arm-mstar-linux-gnueabihf-g++)
set(CMAKE_SYSTEM_NAME Linux)
add_subdirectory(https_client_request_methods)
add_subdirectory(frame_queue)
add_subdirectory(media_processing)
add_subdirectory(commapi)
include_directories(
"${PROJECT_SOURCE_DIR}/media_processing"
"${PROJECT_SOURCE_DIR}/https_client_request_methods"
"${PROJECT_SOURCE_DIR}/frame_queue"
"${PROJECT_SOURCE_DIR}/commapi"
"/home/zy/009/mijia_camera_common/mijia_camera_v4-3.4.9_0215-hid_6000/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include"
"/home/zy/009/mijia_camera_common/miio_source/miio_util/include"
)
link_directories(
"/home/zy/009/mijia_camera_common/mijia_camera_v4-3.4.9_0215-hid_6000/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib"
"${PROJECT_SOURCE_DIR}/media_processing"
"${PROJECT_SOURCE_DIR}/https_client_request_methods"
"${PROJECT_SOURCE_DIR}/frame_queue"
"${PROJECT_SOURCE_DIR}/commapi"
"${PROJECT_SOURCE_DIR}/../lib"
)
aux_source_directory(. DIR_21CN_CLIENT)
add_executable(client ${DIR_21CN_CLIENT})
target_link_libraries(client rt m pthread dl cares ssl crypto z ev shbfev shbf curl HomcaServ frame_queue media_processing https_client_request_methods commapi p2pioapi pj-arm-none-linux-gnu pjlib-util-arm-none-linux-gnu pjnath-arm-none-linux-gnu)
install(TARGETS client DESTINATION .)
3、子目录模板
以静态库方式提供给主目录,方便模块化编译和开发,写完模块后直接编译成静态库给其它项目使用也可以。
set(CMAKE_C_COMPILER /opt/mstar_glibc_host/bin/arm-linux-gcc)
set(CMAKE_CXX_COMPILER /opt/mstar_glibc_host/bin/arm-mstar-linux--g++)
include_directories(
"."
"../"
"../frame_queue"
"../https_client_request_methods"
"../media_processing"
"/home/zy/009/mijia_camera_common/mijia_camera_v4-3.4.9_0215-hid_6000/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include"
"/home/zy/009/mijia_camera_common/miio_source/miio_util/include"
)
link_directories(
"/home/zy/009/mijia_camera_common/mijia_camera_v4-3.4.9_0215-hid_6000/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib"
"../frame_queue"
"../media_processing"
"../https_client_request_methods"
)
aux_source_directory(. DIR_COMMAPI)
add_library(commapi STATIC ${DIR_COMMAPI})
target_link_libraries(commapi https_client_request_methods media_processing frame_queue)