CMake构建动态与静态库

需积分: 5 0 下载量 18 浏览量 更新于2024-08-05 收藏 812B TXT 举报
"CMakeLists.txt 是用于管理项目构建过程的配置文件,它是CMake构建系统的入口。通过编写CMakeLists.txt,你可以指定项目的编译器、编译选项、依赖库等,使得项目能在多种平台上进行跨平台构建。" 在给定的CMakeLists.txt文件中,可以看到以下关键知识点: 1. **cmake_minimum_required**: 这行命令定义了项目所需的CMake版本,这里是3.5,`FATAL_ERROR`参数意味着如果使用的CMake版本低于指定版本,构建过程将终止。这确保了项目能在支持的CMake版本上正确构建。 2. **project**: `project(hardinfo)`创建了一个名为"hardinfo"的项目,并指定了项目语言(默认为C/C++)。这一步会设置一些全局变量,如项目名称和源代码的默认编译语言。 3. **add_library**: `add_library`命令用于创建库。在这里,有三种类型的库被创建: - `message-objs`: 使用`OBJECT`标志创建了一个对象库,它包含了编译但未链接的对象文件(myDll.cpp和myDll.h)。对象库主要用在多库共享源码的情况下,减少重复编译。 - `message-shared`: 创建了一个共享库(动态库),它的内容是`message-objs`目标的对象文件。`SHARED`标志表明这是一个动态链接库。`set_target_properties`设置了库的输出名称为"libhardinfo"。 - `message-static`: 创建了一个静态库(静态库),同样基于`message-objs`的目标对象文件。同样设置了输出名称为"libhardinfo"。 4. **set_target_properties**: 这个命令用于设置目标(库或可执行文件)的特定属性。在这里,`POSITION_INDEPENDENT_CODE`被设置为1,这意味着库的代码是位置无关的,这对于生成共享库是必要的。 5. **$<TARGET_OBJECTS:message-objs>`: 这是CMake的Generator Expression,用于引用`message-objs`目标的所有对象文件,方便在多个库之间共享编译结果。 6. **add_executable**: 虽然在给定的示例中没有实际使用,`add_executable`用于创建一个可执行文件。这里注释掉了`add_executable(hello-world hello-world.cpp)`,说明原本的计划是创建一个名为"hello-world"的可执行程序,其源代码是hello-world.cpp。 7. **target_link_libraries**: 这行代码注释掉了`target_link_libraries(hello-world message-static)`,表示原本打算将静态库`message-static`链接到可执行文件`hello-world`。在实际项目中,你需要取消注释并链接所需的库。 通过这个CMakeLists.txt,我们可以了解到CMake如何管理和构建项目,包括创建不同类型的库,设置库的属性,以及链接这些库到可执行文件。这样的配置文件使得项目能够灵活地适应不同的构建需求和平台。