C语言多个源程序编译的CMakeList文件编写/源程序生成动态库

1.编译多个源程序时CMakeLists文件编写

1.若源程序目录结构如下:

在这里插入图片描述

main.cpp中include“LCD_2inch4.h”头文件,而LCD_2inch4.h中include其它源程序,则CmakeLists.txt文件可为如下:
# 设置项目名称  
cmake_minimum_required(VERSION 3.10) # 确保CMake版本足够新  
project(MyProject)  
  
set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_SYSTEM_PROCESSOR arm)

set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)

#set(CMAKE_SYSROOT ${tools}/sysroot)
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")  
#wiringx是main.cpp中include的其他头文件
  
# 设置编译选项  
set(CMAKE_CXX_STANDARD 11) # 假设您使用C++ (如果是C,请使用CMAKE_C_STANDARD)  
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall")  
  
# 定义USELIB变量并基于它决定是否链接库  这部分if判断可省去
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"  
)  

#for opencv ,main中使用了opencv,不使用则可以不加
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)
#添加opencv头文件
include_directories(${OpenCV_INCLUDE_DIRS})
 
#指定由源程序生成可执行程序main,可换为其它名字
add_executable(main ${SRC_LIST})  

# 查找库文件,指定搜索路径 ,添加第三方库时使用fnd_library,命令,之后 arget_link_libraries命令添加库
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH)  
  
# 如果USELIB是USE_DEV_LIB,则链接pthread和m库  
if("${USELIB}" STREQUAL "USE_DEV_LIB")  
    target_link_libraries(main ${LIBS} ${MY_LIB} ${OpenCV_LIBS} )  
endif()  
  
# 设置输出目录为DIR_BIN(注意:CMake默认使用build目录,但可以通过设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY等变量来改变)  
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})  
  
# 清理规则(CMake不直接支持Makefile的clean目标,但可以使用make clean或自定义命令)  
# 在CMake中,通常使用`cmake --build . --target clean`来清理,这需要在项目根目录的CMakeLists.txt中定义clean目标  
# 这里为了简单起见,我们不定义clean目标  
  
# 如果需要交叉编译,可以设置工具链文件或使用CMAKE_TOOLCHAIN_FILE变量  
# 例如:set(CMAKE_TOOLCHAIN_FILE "path/to/toolchain.cmake")  
# 注意:这需要在您的toolchain.cmake文件中定义交叉编译器的路径和其他相关设置  
  
# 如果您使用的是C而不是C++,请将add_executable替换为add_executable并相应地更改变量名(例如CMAKE_C_FLAGS)

之后在bin目录中cmake … && make命令编译

2.将一些驱动源程序生成动态库so,方便调用

1.main.c每次调用LCD_2inch4.h中的函数需要一起编译这四个源程序文件夹,太麻烦,可将LCD的程序生成so动态链接库,CMakeLists.txt如下:
# 设置项目名称  
cmake_minimum_required(VERSION 3.10) # 确保CMake版本足够新  
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)


# 定义目录变量  ,wiringx是调用外部的库,bin是指定生成的结果文件存放的地方
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) # 假设您使用C++ (如果是C,请使用CMAKE_C_STANDARD)  
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)  
#指定库名为lcd2in4,生成的文件叫做liblcd2in4.so
add_library(lcd2in4 SHARED ${SRC_LIST})

target_link_libraries(lcd2in4 ${LIB} ${MY_LIB})  #添加需要使用的库
  
# 设置输出目录为DIR_BIN(注意:CMake默认使用build目录,但可以通过设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY等变量来改变)  
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
  1. 把main.c中include""LCD_2inch4.h"改为lcd2inch4.h
  2. 新建一个lcd2inch4.h文件,内容就是原来main.c调用的LCD_2inch4.h中的内容,名字是否需要必须和库名字一样不清楚,这里是一样的。
  3. 将h文件 和so文件任意放在哪个位置,只需在CMakeLists.txt中find_librarys时指定so库文件位置即可
  4. 在这里插入图片描述
  5. CMakeLists.txt可为下:
# 设置项目名称  
cmake_minimum_required(VERSION 3.10) # 确保CMake版本足够新  
project(MyProject)  
  
set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_SYSTEM_PROCESSOR arm)

set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)

#set(CMAKE_SYSROOT ${tools}/sysroot)
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) # 假设您使用C++ (如果是C,请使用CMAKE_C_STANDARD)  
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"   
)  
#for opencv,不使用则不添加
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})  

  
# 设置输出目录为DIR_BIN(注意:CMake默认使用build目录,但可以通过设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY等变量来改变)  
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不能识别其函数

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值