cmake_minimum_required (VERSION 3.10) # 交叉编译相关 option (USE_CROSS "Use CROSSCOMPILE" OFF) if (USE_CROSS) # 即你目标机target所在的操作系统名称,比如ARM或者Linux你就需要写"Linux",如果Windows平台你就写"Windows",如果你的嵌入式平台没有相关OS你即需要写成"Generic",只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量CMAKE_CROSSCOMPILING为TRUE. set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_VERSION 1.0) set(CMAKE_SYSTEM_PROCESSOR aarch64) # TOOLSCHAIN_PATH 位置一般是bin lib include 和aarch64-...的目录 set(TOOLSCHAIN_PATH "/home/wcl/emd_dev/n1/openwrt-toolchain-armvirt-64_gcc-8.4.0_musl.Linux-x86_64/toolchain-aarch64_cortex-a53_gcc-8.4.0_musl/") set(TOOLCHAIN_HOST "${TOOLSCHAIN_PATH}/bin/aarch64-openwrt-linux") # 即C语言编译器,这里可以将变量设置成完整路径或者文件名,设置成完整路径有一个好处就是CMake会去这个路径下去寻找编译相关的其他工具比如linker,binutils等,如果你写的文件名带有arm-elf等等前缀,CMake会识别到并且去寻找相关的交叉编译器。 set(CMAKE_C_COMPILER ${TOOLCHAIN_HOST}-gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_HOST}-g++) SET(CMAKE_BUILD_TYPE "Release") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") # 代表了一系列的相关文件夹路径的根路径的变更,比如你设置了/opt/arm/,所有的Find_xxx.cmake都会优先根据这个路径下的/usr/lib,/lib等进行查找,然后才会去你自己的/usr/lib和/lib进行查找,如果你有一些库是不被包含在/opt/arm里面的,你也可以显示指定多个值给CMAKE_FIND_ROOT_PATH,比如set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst) set(CMAKE_FIND_ROOT_PATH ${TOOLSCHAIN_PATH}) # 对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 对FIND_LIBRARY()起作用,表示在链接的时候的库的相关选项,因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的. SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 对FIND_PATH()和FIND_FILE()起作用,一般来说也是ONLY,如果你想改变,一般也是在相关的FIND命令中增加option来改变局部设置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 对于Qt用户来说,需要更改相关的qmake命令切换成嵌入式版本,因此这里需要指定成相应的qmake路径(指定到qmake本身) # SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake) # 对于需要boost库的用户来说,相关的boost库路径配置也需要设置,因此这里的路径即ARM下的boost路径,里面有include和lib。 # SET(BOOST_ROOT /opt/boost_arm) # cmake内置命令不区分大小写 endif (USE_CROSS) # 项目名称 project (ImageDetect) # The version number. set (ImageDetect_VERSION_MAJOR 5) set (ImageDetect_VERSION_MINOR 0) # configure a header file to pass some of the CMake settings # to the source code configure_file ( "${PROJECT_SOURCE_DIR}/ImageDetectConfig.h.in" "${PROJECT_SOURCE_DIR}/ImageDetectConfig.h" ) # 安装路径 set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/install") # 链接库路径操作 set(INSTALL_LIB_DIR $ORIGIN "../lib" "./lib") # 假设安装目录在编译目录的lib子目录内和当前文件夹,这里写成了列表的形式 set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_INSTALL_RPATH "${INSTALL_LIB_DIR}") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) # 存在上面一句,此句好像没有用 # zlog option (USE_ZLOG "Use ImageDetect provided math implementation" ON) if (USE_ZLOG) add_subdirectory (zlog_manager) set (EXTRA_INCS ${EXTRA_INCS} ${ZLOG_INCLUDE_DIR}) message (">>> value = ${EXTRA_INCS}") set (EXTRA_LIBS ${EXTRA_LIBS} zlog_manager) message (">>> value = ${EXTRA_LIBS}") endif (USE_ZLOG) # Try to find OpenCV find_package(OpenCV REQUIRED) if (OpenCV_FOUND) # If the package has been found, several variables will # be set, you can find the full list with descriptions # in the OpenCVConfig.cmake file. # Print some message showing some of them message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") else () message(FATAL_ERROR "Could not locate OpenCV") endif() # 头文件路径 include_directories ("${PROJECT_SOURCE_DIR}") include_directories("${PROJECT_SOURCE_DIR}/zlog_manager/") include_directories("${EXTRA_INCS}") # 因为是使用add_subdirectory的方式,所以库文件路径不用再加link_directories add_executable (ImageDetect ImageDetect.cxx) target_link_libraries (ImageDetect ${OpenCV_LIBS} pthread ${EXTRA_LIBS} ) # 安装(库文件安装位置在子cmake文件中指定) install (TARGETS ImageDetect DESTINATION bin) install (FILES "ImageDetectConfig.h" DESTINATION include) # 测试模式 # enable_testing() # #define a macro to simplify adding tests, then use it # macro (do_test arg result) # add_test (ImageDetectComp${arg} ImageDetect ${arg}) # set_tests_properties (ImageDetectComp${arg} # PROPERTIES PASS_REGULAR_EXPRESSION ${result}) # endmacro (do_test) # # do a bunch of result based tests # do_test (25 "25 is 5") # do_test (-25 "-25 is 0")