1.编译多个源程序时CMakeLists文件编写
1.若源程序目录结构如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/04bd5d7d45ae444e82fe761da4f8b69e.png)
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库文件位置即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/67d45c92bda6429f82ad934342d9e0ec.png)
- 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不能识别其函数
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ea1c458effcd482eb41fbcb6a4651027.png)