Loading... ## 为什么要静态编译 部署程序的时候经常需要编译成纯静态的二进制文件。 相比动态链接,好处是很明显的: 1. 无需依赖,在linux平台上畅通无阻,无需在环境中部署所需的动态库 2. 执行速度更快? 但也有一些坏处: 1. 内存占用较大 2. 文件体积较大 3. 可维护性较差,当库的版本更新后,需要重新编译发布,而不是像动态链接一样直接替换动态库文件 是否需要静态编译就看自己的取舍吧~ ## 如何静态编译 ```cmake 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库就需要自己安装了。 如: ```bash # centos sudo yum install glibc-static # ubuntu sudo apt-get install libc6-dev ``` ## 测试静态链接 编译: ```bash cmake . make ``` 测试: ```bash ldd static_linking_test # 输出not a dynamic executable即为成功 ``` Last modification:August 16th, 2018 at 10:14 am © 允许规范转载