手动编译 JSONCPP 静态库(CMake)
编译静态库
# 下载源码
git clone https://github.com/open-source-parsers/jsoncpp.git
cd jsoncpp
mkdir build && cd build
# 编译静态库
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF ..
make
编译完成后,静态库文件libjsoncpp.a
会出现在build/lib/
目录中。
参数含义
-DBUILD_STATIC_LIBS=ON
- 作用:显式指定构建静态库(
.a
或.lib
文件)。当设置为ON
时,强制生成静态库;若为OFF
则禁止生成静态库。 - 技术细节:静态库会将所有代码和数据直接编译到最终的可执行文件中,运行时无需依赖外部库文件,适用于需要独立部署或避免动态库依赖的场景。
- 作用:显式指定构建静态库(
-DBUILD_SHARED_LIBS=OFF
- 作用:显式禁止构建动态库(
.so
或.dll
文件)。当设置为OFF
时,CMake 不会生成动态库;若为ON
则默认生成动态库(除非被其他参数覆盖)。 - 技术细节:动态库在运行时通过链接加载,可减少内存占用并支持热更新,但需要确保运行时环境存在对应的库文件。关闭此选项后,项目仅生成静态库,或由
BUILD_STATIC_LIBS
单独控制。
- 作用:显式禁止构建动态库(
组合使用场景
- 静态库优先:若同时设置
-DBUILD_STATIC_LIBS=ON
和-DBUILD_SHARED_LIBS=OFF
,CMake 仅生成静态库,这种配置常见于嵌入式系统或需要简化依赖分发的项目。 - 默认行为:若不指定这些参数,CMake 默认
BUILD_SHARED_LIBS=ON
,即优先生成动态库。
注意事项
- 冲突处理:若两者均设为
ON
,CMake 可能同时生成静态库和动态库(取决于项目配置),但通常建议明确指定单一类型以避免潜在冲突。 - 代码适配性:某些项目可能通过宏(如
MY_INFO_SHARED_LIBS
)区分库类型,需确保头文件中的导出符号(如__declspec(dllexport)
)与构建类型匹配。