linux 上编译 c++ 项目结构

本文展示在 Linux 中使用 CMake 构建 C++ 文件的最简完整示例,包含可执行文件和库文件的分离输出

1. 多文件项目结构

  • build/:存放临时构建文件(可以随时删除重新构建)
  • bin/:存放最终的可执行文件(供用户直接使用)
  • lib/:存放编译好的库文件
  • include/:存放公共头文件(供其他项目使用)

创建项目目录结构

bash 复制代码
mkdir -p my_project/{bin,lib,build,include,src}
cd my_project
touch CMakeLists.txt
touch include/hello.h
touch src/{main.cpp,hello.cpp}

最终项目结构

复制代码
my_project/
├── bin/           # 可执行文件输出目录(构建后自动生成)
├── lib/           # 库文件输出目录(构建后自动生成)
├── build/         # 构建中间文件目录
├── include/       # 公共头文件
│   └── hello.h
├── src/           # 源代码
│   ├── main.cpp
│   └── hello.cpp
└── CMakeLists.txt

include/hello.h

cpp 复制代码
#ifndef HELLO_H
#define HELLO_H

void printHello();

#endif

src/hello.cpp

cpp 复制代码
#include <iostream>
#include "hello.h"

void printHello() {
    std::cout << "Hello from library function!" << std::endl;
}

src/main.cpp

cpp 复制代码
#include <iostream>
#include "hello.h"

int main() {
    printHello();
    std::cout << "Hello from executable!" << std::endl;
    return 0;
}

2. CMakeLists.txt 配置

cmake 复制代码
# 指定最低CMake版本
cmake_minimum_required(VERSION 3.10)

# 定义项目名称
project(MyProject)

# 设置输出目录(关键配置)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)  # 可执行文件
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)  # 动态库
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)  # 静态库

# 指定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 创建库文件(静态库)
add_library(hello STATIC src/hello.cpp)

# 创建可执行文件
add_executable(myapp src/main.cpp)

# 链接库到可执行文件
target_link_libraries(myapp hello)

3. 构建和运行完整流程

步骤1:进入项目目录

bash 复制代码
cd my_project

步骤2:创建并进入构建目录

bash 复制代码
mkdir build
cd build

步骤3:配置项目(生成构建文件)

bash 复制代码
cmake ..

输出示例:

复制代码
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/my_project/build

步骤4:编译项目

bash 复制代码
cmake --build .

输出示例:

复制代码
Scanning dependencies of target hello
[ 25%] Building CXX object CMakeFiles/hello.dir/src/hello.cpp.o
[ 50%] Linking CXX static library ../../lib/libhello.a
[ 50%] Built target hello
Scanning dependencies of target myapp
[ 75%] Building CXX object CMakeFiles/myapp.dir/src/main.cpp.o
[100%] Linking CXX executable ../../bin/myapp
[100%] Built target myapp

步骤5:查看生成的文件

bash 复制代码
# 查看bin目录(可执行文件)
ls -l ../bin/

输出:

复制代码
-rwxr-xr-x 1 user user 16720 Mar 11 10:00 myapp
bash 复制代码
# 查看lib目录(库文件)
ls -l ../lib/

输出:

复制代码
-rw-r--r-- 1 user user 1590 Mar 11 10:00 libhello.a

步骤6:运行程序

bash 复制代码
../bin/myapp

输出:

复制代码
Hello from library function!
Hello from executable!

步骤7:(可选)清理构建文件

bash 复制代码
# 删除build目录(保留bin和lib)
cd ..
rm -rf build

# 如果要彻底清理(包括bin和lib)
rm -rf build bin lib

4. 完整的命令序列(一键复制版)

bash 复制代码
# 创建项目结构
mkdir -p my_project/{bin,lib,build,include,src}
cd my_project

# 创建头文件
cat > include/hello.h << 'EOF'
#ifndef HELLO_H
#define HELLO_H
void printHello();
#endif
EOF

# 创建库源文件
cat > src/hello.cpp << 'EOF'
#include <iostream>
#include "hello.h"
void printHello() {
    std::cout << "Hello from library function!" << std::endl;
}
EOF

# 创建主程序文件
cat > src/main.cpp << 'EOF'
#include <iostream>
#include "hello.h"
int main() {
    printHello();
    std::cout << "Hello from executable!" << std::endl;
    return 0;
}
EOF

# 创建CMakeLists.txt
cat > CMakeLists.txt << 'EOF'
cmake_minimum_required(VERSION 3.10)
project(MyProject)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)

include_directories(${PROJECT_SOURCE_DIR}/include)

add_library(hello STATIC src/hello.cpp)
add_executable(myapp src/main.cpp)
target_link_libraries(myapp hello)
EOF

# 构建和运行
cd build
cmake ..
cmake --build .
../bin/myapp

5. 验证构建结果

bash 复制代码
# 验证可执行文件
ls -l ../bin/
file ../bin/myapp

# 验证库文件
ls -l ../lib/
file ../lib/libhello.a

# 运行测试
../bin/myapp

6. 关键点说明

输出目录变量说明

CMake 变量 用途 对应目录
CMAKE_RUNTIME_OUTPUT_DIRECTORY 可执行文件(.exe, .dll) bin/
CMAKE_LIBRARY_OUTPUT_DIRECTORY 动态库(.so, .dylib, .dll) lib/
CMAKE_ARCHIVE_OUTPUT_DIRECTORY 静态库(.a, .lib) lib/

库类型说明

  • STATIC:静态库(.a 文件),编译时链接到可执行文件
  • SHARED:动态库(.so 文件),运行时加载

这样就完成了可执行文件在 bin/、库文件在 lib/ 的 CMake 项目构建完整流程。

相关推荐
大树8820 分钟前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠23 分钟前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 小时前
Linux 11 动态监控指令top
linux
Inhand陈工2 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
玖玥拾2 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
酣大智2 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩2 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_2 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化