为什么要静态编译
部署程序的时候经常需要编译成纯静态的二进制文件。
相比动态链接,好处是很明显的:
- 无需依赖,在linux平台上畅通无阻,无需在环境中部署所需的动态库
- 执行速度更快?
但也有一些坏处:
- 内存占用较大
- 文件体积较大
- 可维护性较差,当库的版本更新后,需要重新编译发布,而不是像动态链接一样直接替换动态库文件
是否需要静态编译就看自己的取舍吧~
如何静态编译
cmake_minimum_required(VERSION 2.8)
project(static_linking_test)
# 静态链接
set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc")
# 搜索当前文件夹下所有的cpp文件
file(GLOB SRC *.cpp)
# 以boost为例,设置使用boost的静态库
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED system thread filesystem timer chrono
program_options)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(static_linking_test ${SRC})
set_target_properties(static_linking_test PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(static_linking_test PROPERTIES LINK_SEARCH_END_STATIC 1)
# 链接所需要的静态库
target_link_libraries(static_linking_test -static
${Boost_LIBRARIES}
zlib
pthread
rt
)
通常需要安装开发环境的各个静态库,第三方库就需要自己编译或是使用别人编译好的。libc库就需要自己安装了。
如:
# centos
sudo yum install glibc-static
# ubuntu
sudo apt-get install libc6-dev
测试静态链接
编译:
cmake .
make
测试:
ldd static_linking_test
# 输出not a dynamic executable即为成功