cmake(6):库文件生成 add_library,设置库文件的存放目录 LIBRARY_OUTPUT_PATH,链接静态库 link_libraries、指出库位置link_directories

(17) 库文件生成 add_library

在这里插入图片描述

++ 动态库文件的生成过程与效果

在这里插入图片描述

++ 只需要给客户提供对应库文件的头文件,以及编译好的库文件,不再提供库文件的实现源代码

(18)指定库文件的存放目录 LIBRARY_OUTPUT_PATH

在这里插入图片描述

++ 换系统变量

在这里插入图片描述

++ 动静态库文件的实验结果如下

在这里插入图片描述

(19)链接静态库 link_libraries、指出静态库位置 link_directories

在这里插入图片描述

++ 以及对应的 CMakeLists.txt 文件的编写

在这里插入图片描述

++ 测试结果

在这里插入图片描述

++ 还发现了一个结论:静态库比动态库要小,因为动态库要保留更多的符号信息以备随后的连接

在这里插入图片描述

(20)

谢谢

<think>好的,我现在需要帮用户解释一下`add_library(EH4A SHARED path)`这个CMake命令的作用和用法。用户之前已经询问过CMake生成的文件,现在转向具体的构建命令,说明他们可能在尝试构建共享,但可能对参数不太清楚。 首先,我得确认用户提到的`add_library`命令的结构是否正确。标准的`add_library`语法是`add_library(target_name [STATIC | SHARED | MODULE] source_files)`。用户给出的例子是`EH4A SHARED path`,这里可能有问题,因为`path`看起来像是一个目录,而CMake需要的是具体的源文件列表。可能用户是想指定路径下的所有源文件,或者`path`是一个变量? 接下来,我需要分解每个参数的作用。`EH4A`是目标的名称,SHARED表示生成动态,而`path`应该是源文件路径。但用户是否正确处理了源文件的添加?比如,是否使用了`aux_source_directory`或者`file(GLOB)`来收集源文件?直接使用目录路径可能不起作用,需要明确列出文件。 然后,用户可能的疑问点:SHARED和STATIC的区别,生成库文件命名规则,以及如何指定输出目录。此外,是否需要考虑平台差异,比如Windows的DLL和Linux的.so文件? 可能用户在实际使用中遇到了问题,比如未正确生成,或者路径错误导致找不到源文件。需要提醒用户检查路径是否正确,源文件是否存在,以及是否需要在CMakeLists.txt中添加其他指令,比如`include_directories`或`target_link_libraries`。 另外,用户可能对CMake中的目标属性不太熟悉,比如设置版本或安装规则。是否需要补充这些内容?或者用户只是需要基础用法的说明? 需要确保回答清晰,分点解释每个部分,并给出正确的示例,比如使用`file(GLOB SOURCES path/*.cpp)`来收集源文件,再传递给`add_library`。同时,指出常见错误,比如直接使用目录路径,或者忘记设置CXX标准等。 最后,确认回答是否覆盖了用户可能的真实需求,比如跨平台构建、调试符号、安装步骤等。是否需要推荐最佳实践,比如避免使用GLOB收集源文件,而是显式列出,以保证构建系统的可靠性?</think>以下是关于 CMake 命令 `add_library(EH4A SHARED path)` 的详细解释: --- ### **命令语法** ```cmake add_library(<目标名称> [STATIC | SHARED | MODULE] [源文件或目录路径]) ``` - **作用**:生成一个库文件静态库、动态或模块)。 - **关键参数**: - `<目标名称>`:自定义的名称(如 `EH4A`)。 - `SHARED`:生成**动态链接**(Windows 为 `.dll`,Linux/macOS 为 `.so` 或 `.dylib`)。 - `STATIC`:生成**静态链接**(Windows 为 `.lib`,Linux/macOS 为 `.a`)。 - `源文件或目录路径`:指定构建所需的源码文件(需明确路径或文件列表)。 --- ### **示例分析:`add_library(EH4A SHARED path)`** #### **1. 可能的问题** - **`path` 的含义**:若 `path` 是目录路径(如 `src/`),CMake **不会自动递归添加该目录下的源文件**。 - **需显式指定源文件**:需手动列出文件或使用 `file(GLOB)` 或 `aux_source_directory()` 收集文件。 #### **2. 正确用法** ##### **方式 1:直接列出源文件** ```cmake add_library(EH4A SHARED path/file1.cpp path/file2.cpp ) ``` ##### **方式 2:自动收集目录下的源文件** ```cmake # 收集指定目录下的所有 .cpp 文件 file(GLOB SOURCES "path/*.cpp") add_library(EH4A SHARED ${SOURCES}) ``` ##### **方式 3:使用辅助函数** ```cmake # 收集指定目录下的所有源文件(需谨慎使用,避免包含非目标文件) aux_source_directory(path DIR_SRCS) add_library(EH4A SHARED ${DIR_SRCS}) ``` --- ### **关键注意事项** 1. **避免直接使用目录路径**: - **错误示例**:`add_library(EH4A SHARED path)`(`path` 是目录时无效)。 - **正确做法**:显式列出文件或使用 `file(GLOB)` 收集文件。 2. **动态生成规则**: - **Windows**:生成 `.dll`(动态)和 `.lib`(导入)。 - **Linux/macOS**:生成 `.so` 或 `.dylib`,默认不生成符号链接。 - 可通过 `set_target_properties` 设置版本和符号链接: ```cmake set_target_properties(EH4A PROPERTIES VERSION 1.2.3 # 版本 SOVERSION 1 # API 版本 ) ``` 3. **输出路径控制**: - 默认生成在 `build` 目录下,可通过以下命令修改输出路径: ```cmake set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) ``` 4. **依赖管理**: - 若依赖其他目标(如另一个),需添加链接指令: ```cmake target_link_libraries(EH4A PRIVATE other_library) ``` --- ### **完整 CMakeLists.txt 示例** ```cmake cmake_minimum_required(VERSION 3.10) project(MyLibrary) # 收集源文件 file(GLOB SOURCES "src/*.cpp") # 生成动态 add_library(EH4A SHARED ${SOURCES}) # 设置动态版本 set_target_properties(EH4A PROPERTIES VERSION 1.0.0 SOVERSION 1 ) # 指定输出目录 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) ``` --- ### **常见问题排查** 1. **找不到源文件**: - 检查路径是否正确(相对路径基于 `CMakeLists.txt` 所在目录)。 - 使用 `message(STATUS "Sources: ${SOURCES}")` 打印文件列表确认。 2. **生成库文件缺失**: - Windows 下需确保生成 `.dll` 和 `.lib`,若只有 `.lib`,检查是否误用 `STATIC`。 3. **符号未导出**: - 动态需在代码中显式标记导出符号(如使用 `__declspec(dllexport)`)。 --- 通过合理使用 `add_library`,可以高效管理 C/C++ 项目的构建过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值