c++ cmake 静态编译
时间: 2024-08-12 13:05:02 浏览: 49
在CMake中,静态编译是指创建目标时将所有库函数和依赖项都链接到最终二进制文件中,而不是像动态链接那样仅链接到共享库。在CMake中配置静态编译,通常涉及以下几个步骤:
1. **设置构建类型**:
在CMakeLists.txt中添加如下的行,选择`STATIC`或`CMAKE_BUILD_TYPE=Release`来启用静态链接:
```cmake
set(CMAKE_BUILD_TYPE Release) # 或者 Static, Debug等
```
2. **链接选项**:
添加 `-static` 或 `INTERFACE_LINK_LIBRARIES` 和 `STATIC相传接` 到对应的`target_link_libraries()`调用中,告诉CMake链接静态库:
```cmake
target_link_libraries(my_target static_lib_name)
```
3. **包含目录**:
如果有静态库依赖,可能还需要设置`include_directories()`指向头文件所在的位置,以便找到静态库的声明。
4. **安装配置**:
需要注意的是,静态链接的安装过程可能比动态链接复杂,因为静态库通常是较大的二进制文件,安装包可能会更大。
相关问题
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
```
需要注意的是,静态编译的可执行文件可能会比较大,因为它包含了所有的依赖库,因此需要权衡可执行文件的大小和可移植性。
c++ fortran 用cmake混合编译
可以使用 CMake 实现 C++ 与 Fortran 的混合编译。以下是一个简单的示例:
```cmake
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX Fortran)
# C++ 编译选项
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Fortran 编译选项
enable_language(Fortran)
set(CMAKE_Fortran_STANDARD 90)
set(CMAKE_Fortran_STANDARD_REQUIRED ON)
# 添加 C++ 与 Fortran 源文件
add_executable(MyExecutable main.cpp myfunction.f90)
```
在这个示例中,我们将 C++ 和 Fortran 文件都添加到了同一个可执行文件中,以确保 C++ 与 Fortran 代码之间可以相互调用。如果需要更复杂的混合编译方案,可以使用 CMake 的 `add_library` 命令将 C++ 与 Fortran 代码分别编译成静态或动态库,再进行链接。
相关推荐
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)