最近有一个多个 .h .cc .cpp 编译成静态库的需求,故记录下过程
静态库不同于动态库,它不需要 main 入口,只要各个源文件与头文件能对应,也就是源文件和头文件引用的头文件能够找到函数的符号文件,即可编译成功
新手教程参考:
因为只需要用到部分源文件,故单独列出,我的 CMakeLists 写法:
cmake_minimum_required(VERSION 3.12)
project(MyLibrary)
# 设置编译选项
set(CMAKE_GENERATOR_PLATFORM x86)
set(SOURCES
cuteui/base/base64.cc
cuteui/base/md5.cc
cuteui/base/sha1_portable.cc
cuteui/base/counter.cc
cuteui/base/windows_version.cc
cuteui/base/at_exit.cc
cuteui/base/debug/alias.cc
cuteui/base/debug/debugger.cc
cuteui/base/debug/debugger_win.cc
cuteui/base/debug/stack_trace.cc
cuteui/base/debug/stack_trace_win.cc
cuteui/base/win/event_trace_provider.cc
cuteui/base/lock.cc
cuteui/base/lock_impl_win.cc
cuteui/base/event.cc
cuteui/base/callback.cc
cuteui/base/lazy_instance.cc
cuteui/base/memory/singleton.cc
cuteui/base/threading/platform_thread.cc
cuteui/base/rand_util.cc
cuteui/base/rand_util_win.cc
cuteui/base/vlog.cc
cuteui/base/logging.cc
cuteui/base/logging_win.cc
cuteui/base/json/values.cc
cuteui/base/json/values_op.cc
cuteui/base/json/json_reader.cc
cuteui/base/json/json_writer.cc
cuteui/base/json/string_escape.cc
cuteui/base/file/file.cc
cuteui/base/file/filedata.cc
cuteui/base/file/file_path.cc
cuteui/base/file/file_path_constants.cc
cuteui/base/string/string_util.cc
cuteui/base/string/stringprintf.cc
cuteui/base/string/string_number_conversions.cc
cuteui/base/string/utf_string_conversion_utils.cc
cuteui/base/string/string_piece.cc
cuteui/base/string/utf_string_conversions.cc
cuteui/base/string/string_split.cc
cuteui/base/operation/fileselect.cc
cuteui/base/operation/threadpool.cc
cuteui/base/third_party/dmg_fp/dtoa.cc
cuteui/base/third_party/dmg_fp/g_fmt.cc
cuteui/base/third_party/icu/icu_utf.cc
cuteui/base/third_party/modp_b64/modp_b64.cc
common/bbiconv.cc
common/Buffer.cpp
common/properties.cpp
common/strconv.cpp
common/string_easy_conv.cc
common/Urlcode.cpp
common/wiseint.cc
)
# Add a library with the above sources
add_library(${PROJECT_NAME} STATIC ${SOURCES})
# 添加头文件搜索路径
include_directories(common cuteui engine)
编译过程中会遇到很多奇怪的错误,不过都能解决,这边总结一下:
- 出现头文件找不到的情况,可能是存在目录路径的问题,建议加上相对路径
- 明明这个函数有声明,却显示未声明,可能是需要添加预处理器定义,比如我遇到找不到 rand_s 的情况,最后加上 _CRT_RAND_S 解决的
- 可能出现 sdk 中的函数冲突的问题,这个问题经常出现,可以添加一个 stdafx.h 通用头文件,在该头文件添加 winsock2.h 和 windows.h
- 某些函数找不到声明,需要仔细找到该函数的声明文件的位置,使用全局搜索一般能找到,添加即可
- 编译静态库有 debug 和 release 之分,建议两种都编译一下
一些文章参考: