使用CMakeLists.txt创建一个动态库工程Demo给main程序使用

主要需求是把 hello 程序编译动态库,再 main 程序或者第三方程序执行的时候动态加载。

工程目录如下:

$ ls -al *
-rw-r--r-- 1 neuti 197609 352 Oct 20 19:30 CMakeLists.txt

include:
total 1
drwxr-xr-x 1 neuti 197609  0 Oct 20 19:30 ./
drwxr-xr-x 1 neuti 197609  0 Oct 20 19:30 ../
-rw-r--r-- 1 neuti 197609 93 Oct 20 19:30 hello.h

src:
total 2
drwxr-xr-x 1 neuti 197609   0 Oct 20 19:30 ./
drwxr-xr-x 1 neuti 197609   0 Oct 20 19:30 ../
-rw-r--r-- 1 neuti 197609 112 Oct 20 19:30 hello.c
-rw-r--r-- 1 neuti 197609 103 Oct 20 19:30 main.c

include 目录是头文件目录,src 是源文件目录。

CMakeLists.txt 文件内容如下:

cmake_minimum_required(VERSION 3.10)

project(main)

# Use C11
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED True)

# Add include directories
include_directories(include)

# Add shared lib files
add_library(hello SHARED src/hello.c)

# Add source files
add_executable(main src/main.c)

# Build target
target_link_libraries(main hello)

main 程序中调用 hello 动态库中的 print_hello_world接口:

#include <stdio.h>
#include "hello.h"

int main()
{
    print_hello_world();
    return 0;
}

hello.c 内容:

#include <stdio.h>
#include "hello.h"

void print_hello_world(void)
{
    printf("Hello, world!\n");
}

hello.h 内容:

#ifndef HELLO_H
#define HELLO_H

void print_hello_world(void);

#endif /* HELLO_H */

编译工程:

cmake .
make

执行程序:

./main
### 创建和配置 CMakeLists.txt 文件 在 Windows 系统中编写和配置 `CMakeLists.txt` 文件的过程可以分为以下几个方面来理解: #### 1. **定义项目基本信息** 通过 `project()` 命令指定项目的名称以及使用的编程语言。这一步是必要的,因为它是整个构建系统的起点[^2]。 ```cmake project(MyProject LANGUAGES CXX) ``` 上述命令创建一个名为 `MyProject` 的项目,并指定了使用的是 C++ 语言。 --- #### 2. **设置最小版本需求** 为了确保兼容性和功能支持,通常会在文件开头声明所需的最低 CMake 版本。 ```cmake cmake_minimum_required(VERSION 3.10) ``` 这里设置了最低需要的 CMake 版本为 3.10[^4]。 --- #### 3. **添加可执行文件或库** 如果目标是一个简单的应用程序,则可以通过 `add_executable()` 添加可执行文件;如果是动态链接库 (DLL),则可以用 `add_library(SHARED)` 来实现[^3]。 对于一个简单的程序: ```cmake add_executable(myapp main.cpp utils.cpp) ``` 而对于生成共享库的情况: ```cmake add_library(hello SHARED hello.cpp) ``` 以上分别展示了如何添加一个可执行文件 (`myapp`) 和一个共享库 (`hello.dll`)。 --- #### 4. **处理头文件路径** 当源码依赖于特定目录下的头文件时,需用到 `target_include_directories()` 设置额外的包含路径。 ```cmake target_include_directories(myapp PRIVATE ${PROJECT_SOURCE_DIR}/include) ``` 此命令让编译器知道去哪里查找 `.h` 或 `.hpp` 文件。 --- #### 5. **链接外部库** 如果有第三方库参与构建过程,可通过 `find_package()` 查找并连接这些库。 ```cmake find_package(Boost REQUIRED COMPONENTS system filesystem) if(Boost_FOUND) target_link_libraries(myapp Boost::system Boost::filesystem) endif() ``` 这段代码尝试定位 Boost 库中的组件,并将其链接至目标二进制文件。 --- #### 6. **跨平台注意事项** 由于不同操作系统可能有不同的行为模式,在某些情况下还需要考虑条件判断语句以适应多样的运行环境。 ```cmake if(WIN32) add_definitions(-DWIN32_LEAN_AND_MEAN) elseif(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif() ``` 上面的例子演示了针对 Windows 平台优化宏定义的方法[^1]。 --- #### 示例完整的 CMakeLists.txt 文件 以下是综合前面提到的内容的一个例子: ```cmake cmake_minimum_required(VERSION 3.10) # 设定所需最低版号 project(DemoApp LANGUAGES CXX) # 初始化工程信息 [^2] set(SOURCES src/main.cpp src/utils.cpp) # 列举所有源档案位置 add_executable(demo_app ${SOURCES}) # 将它们组合成最终产物 demo_app 可执行档 # 如果存在其他资源比如图片字体等也可以加入打包清单里去... install(TARGETS demo_app DESTINATION bin) # 部署成果物到指定地方 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值