1.编译多个源程序时CMakeLists文件编写
1.若源程序目录结构如下:

main.cpp中include“LCD_2inch4.h”头文件,而LCD_2inch4.h中include其它源程序,则CmakeLists.txt文件可为如下:
cmake_minimum_required(VERSION 3.10)
project(MyProject) set(CMAKE_SYSTEM_NAME Linux)
set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-g++)
set(CMAKE_AR ${tools}/bin/riscv64-unknown-linux-musl-ar)
set(CMAKE_RANLIB ${tools}/bin/riscv64-unknown-linux-musl-ranlib)
set(DIR_Config "${CMAKE_SOURCE_DIR}/lib/Config")
set(DIR_EPD "${CMAKE_SOURCE_DIR}/lib/LCD")
set(DIR_FONTS "${CMAKE_SOURCE_DIR}/lib/Fonts")
set(DIR_GUI "${CMAKE_SOURCE_DIR}/lib/GUI")
set(DIR_Examples "${CMAKE_SOURCE_DIR}/examples")
set(DIR_wiringx "/home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr")
set(DIR_BIN "${CMAKE_SOURCE_DIR}/bin")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall")
set(USELIB "USE_DEV_LIB")
if("${USELIB}" STREQUAL "USE_DEV_LIB") set(LIBS pthread m)
else() set(LIBS "")
endif()
include_directories( ${DIR_Config} ${DIR_EPD} ${DIR_GUI} ${DIR_FONTS} ${DIR_Examples} "${DIR_wiringx}/include"
)
file(GLOB_RECURSE SRC_LIST "${DIR_EPD}/*.c" "${DIR_Config}/*.c" "${DIR_GUI}/*.c" "${DIR_Examples}/*.cpp" "${DIR_FONTS}/*.c"
)
set(OpenCV_DIR "/home/tao/linux/milkv-duo256/duo-examples/opencv-mobile-milkv/opencv-mobile-4.9.0-milkv-duo/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(main ${SRC_LIST})
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH)
if("${USELIB}" STREQUAL "USE_DEV_LIB") target_link_libraries(main ${LIBS} ${MY_LIB} ${OpenCV_LIBS} )
endif()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})
之后在bin目录中cmake … && make命令编译
2.将一些驱动源程序生成动态库so,方便调用
1.main.c每次调用LCD_2inch4.h中的函数需要一起编译这四个源程序文件夹,太麻烦,可将LCD的程序生成so动态链接库,CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.10)
project(MyProject) set(CMAKE_SYSTEM_NAME Linux)
set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-g++)
set(CMAKE_AR ${tools}/bin/riscv64-unknown-linux-musl-ar)
set(CMAKE_RANLIB ${tools}/bin/riscv64-unknown-linux-musl-ranlib)
set(DIR_Config "${CMAKE_SOURCE_DIR}/lib/Config")
set(DIR_EPD "${CMAKE_SOURCE_DIR}/lib/LCD")
set(DIR_FONTS "${CMAKE_SOURCE_DIR}/lib/Fonts")
set(DIR_GUI "${CMAKE_SOURCE_DIR}/lib/GUI")
set(DIR_wiringx "/home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr")
set(DIR_BIN "${CMAKE_SOURCE_DIR}/bin")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall")
set(LIBS pthread m)
include_directories( ${DIR_Config} ${DIR_EPD} ${DIR_GUI} ${DIR_FONTS} "${DIR_wiringx}/include"
)
file(GLOB_RECURSE SRC_LIST "${DIR_EPD}/*.c" "${DIR_Config}/*.c" "${DIR_GUI}/*.c" "${DIR_FONTS}/*.c"
)
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH)
add_library(lcd2in4 SHARED ${SRC_LIST})target_link_libraries(lcd2in4 ${LIB} ${MY_LIB})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})
在bin目录使用cmake … && make即可生成库liblcd2inch4.so
- 把main.c中include""LCD_2inch4.h"改为lcd2inch4.h
- 新建一个lcd2inch4.h文件,内容就是原来main.c调用的LCD_2inch4.h中的内容,名字是否需要必须和库名字一样不清楚,这里是一样的。
- 将h文件 和so文件任意放在哪个位置,只需在CMakeLists.txt中find_librarys时指定so库文件位置即可

- CMakeLists.txt可为下:
cmake_minimum_required(VERSION 3.10)
project(MyProject) set(CMAKE_SYSTEM_NAME Linux)
set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-g++)
set(CMAKE_AR ${tools}/bin/riscv64-unknown-linux-musl-ar)
set(CMAKE_RANLIB ${tools}/bin/riscv64-unknown-linux-musl-ranlib)
set(DIR_Examples "${CMAKE_SOURCE_DIR}/examples")
set(DIR_wiringx "/home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr")
set(DIR_BIN "${CMAKE_SOURCE_DIR}/bin")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall") set(LIBS pthread m)
include_directories( ${DIR_Examples} "${DIR_wiringx}/include"
)
file(GLOB_RECURSE SRC_LIST "${DIR_Examples}/*.cpp"
)
set(OpenCV_DIR "/home/tao/linux/milkv-duo256/duo-examples/opencv-mobile-milkv/opencv-mobile-4.9.0-milkv-duo/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})add_executable(main ${SRC_LIST})
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH) find_library(LCD_LIB NAMES lcd2in4 PATHS ${DIR_Examples} NO_DEFAULT_PATH) target_link_libraries(main ${LIBS} ${MY_LIB} ${OpenCV_LIBS} ${LCD_LIB})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})
3.若cpp文件中include 其他头文件,但其他头文件对应源程序为c程序实现的,则使用extern "C"告诉编译器这些函数签名用c语言的函数签名。否则cpp不能识别其函数
