cmake构建静态可执行程序
时间: 2024-07-30 18:01:21 浏览: 192
CMake是一个开源的、跨平台的自动化构建系统,它主要用于管理和构建C/C++项目。构建静态可执行程序,意味着编译后的目标文件不会包含动态链接库,程序可以在没有对应库的情况下独立运行。
在CMake中构建静态可执行程序通常需要设置一些选项:
1. **选择构建类型**:添加`-DCMAKE_BUILD_TYPE=Release`到CMake命令行中,这将生成优化的静态库和静态链接的目标。
```sh
cmake -DCMAKE_BUILD_TYPE=Release ..
```
2. **指定链接方式**:在`add_executable`指令中,设置`STATIC_LIBRARY`或`STANDARD_EXCLUDE_FROM_ALL`为true,强制编译为静态链接。
```cmake
add_executable(<your_app> src1.c src2.cpp STATIC_LIBRARY)
```
3. **排除共享库依赖**:如果某些库是默认的动态链接,你需要明确指定它们为静态链接,例如`find_package(Boost REQUIRED COMPONENTS system filesystem static)`。
4. **配置构建规则**:CMakeLists.txt文件中需要配置适当的规则,如使用`target_link_libraries`来连接静态库,而不是`link_directories`。
5. **生成并构建**:最后,使用`cmake --build . --config Release`生成静态版本的可执行文件。
相关问题
cmake静态编译可执行文件demo
CMake是一个跨平台的构建系统。它可以自动生成Makefile或是Visual Studio的项目文件,以达到构建目标的效果。
静态编译指所有用到的第三方库都会被链接到最终的二进制文件中,因此这种方式生成的可执行文件可以在不同的机器上运行,而不必考虑库文件的路径和版本等问题。
下面是一个简单的CMakeLists.txt文件,用于生成一个静态编译的可执行文件。
```cmake
cmake_minimum_required(VERSION 3.5)
project(demo)
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_STANDARD 11)
set(SOURCES main.cpp)
set(LIBRARIES lib1 lib2)
include_directories(include)
add_executable(demo ${SOURCES})
target_link_libraries(demo ${LIBRARIES})
```
在这个例子中,我们定义了一个项目名称为demo,设置了编译器为g++,使用C++11标准进行编译。我们还定义了源码文件名为main.cpp,库文件名为lib1和lib2。在CMakeLists.txt中,我们通过add_executable命令将源码文件编译成可执行文件,并通过target_link_libraries命令将库文件链接到可执行文件中。
在项目目录下执行以下指令:
```bash
mkdir build && cd build
cmake ..
make
```
即可在build目录下生成可执行文件demo。我们可以使用ldd命令查看可执行文件的依赖关系,发现所有依赖库都已经被链接到了二进制文件中。
```bash
ldd demo
```
需要注意的是,静态编译的可执行文件可能会比较大,因为它包含了所有的依赖库,因此需要权衡可执行文件的大小和可移植性。
cmake 使用静态库
要在CMake中使用静态库,你需要按照以下步骤操作:
1. 配置静态库的构建:首先,你需要编译生成静态库。通常,你会得到一个以`.a`为扩展名的文件,该文件包含编译的目标代码。你可以使用`add_library`命令将静态库添加到CMakeLists.txt文件中,例如:
```
add_library(mylib STATIC mylib.cpp)
```
2. 链接静态库:在你的可执行文件或其他目标中,你需要链接静态库。使用`target_link_libraries`命令将静态库链接到你的目标上,例如:
```
add_executable(myapp main.cpp)
target_link_libraries(myapp mylib)
```
3. 设置头文件路径:如果静态库包含了一些头文件,你需要确保CMake可以找到它们。使用`target_include_directories`命令将头文件路径添加到目标中,例如:
```
target_include_directories(myapp PRIVATE include)
```
以上步骤会将静态库与你的应用程序正确链接起来。你可以根据你的项目需要进行相应的调整。
阅读全文