进程与静态链接库

基本文件准备

创建文件夹 demo,并在该文件夹下创建进程项目文件夹 exec 以及静态链接库项目文件夹 lib_static 。
在文件夹 demo 中以及各项目文件夹下创建 build 文件夹以及 CMakeLists.txt 文件。
其中,进程项目 exec 依赖于静态链接库 lib_static 。

源码目录以及构建目录

./demo/
|--build
|--CMakeLists.txt
|--exec
|--|--build
|--|--CMakeLists.txt
|--|--my_add.h
|--|--my_add.cpp
|--|--main.cpp
|--lib_static
|--|--build
|--|--CMakeLists.txt
|--|--my_multiply_s.h
|--|--my_multiply_s.cpp

各个build文件夹

该文件夹下存放编译时的各类缓存文件,重新编译可以进入到该文件夹路径下,执行:

rm -r *

即可删除全部子文件夹以及子文件。
也可以使用CMake的操作文件以及文件夹的命令清空缓存。

根目录文件夹 demo

CMakeLists.txt
cmake_minimum_required (VERSION 3.22)

#是否清除缓存
if((CLEAR AND (${CLEAR} STREQUAL "1")) OR (clear AND (${clear} STREQUAL "1")))
    file(REMOVE "${CMAKE_SOURCE_DIR}/build/cmake_install.cmake")
    file(REMOVE "${CMAKE_SOURCE_DIR}/build/CMakeCache.txt")
    file(REMOVE "${CMAKE_SOURCE_DIR}/build/CMakefile")
    file(REMOVE_RECURSE "${CMAKE_SOURCE_DIR}/build/CMakeFiles")
endif()

project (process_lib) 

#定义编译位数
set(CMAKE_BUILD_PLATFORM "-m64") 
#set(CMAKE_BUILD_PLATFORM "-m32") 

#定义编译类型
set(CMAKE_BUILD_TYPE "debug") 
#set(CMAKE_BUILD_TYPE "release") 

set(CMAKE_CXX_STANDARD 14)  # 将 C++ 标准设置为 C++ 14
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # C++ 14 是强制要求,不会衰退至低版本
set(CMAKE_CXX_EXTENSIONS OFF)  # 禁止使用编译器特有扩展

if(CMAKE_BUILD_PLATFORM)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_BUILD_PLATFORM}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_BUILD_PLATFORM}")
endif()

#增加子项目并且指定子项目中间文件生成路径
add_subdirectory(${CMAKE_SOURCE_DIR}/lib_static ${CMAKE_SOURCE_DIR}/lib_static/build)
add_subdirectory(${CMAKE_SOURCE_DIR}/exec ${CMAKE_SOURCE_DIR}/exec/build)

注:设置变量CMAKE_BUILD_TYPE时,其不区分大小写,以debug为例,里面的Debug可以替换成Debug,debug,DEBUG,甚至deBug,都会被当成是一样的。

进程项目文件夹 exec

my_add.h
#ifndef __DEMO_ADD_H
#define __DEMO_ADD_H

#include <iostream>

int my_add(int a, int b);

#endif
my_add.cpp
#include "my_add.h"

int my_add(int a, int b)
{
    return a+b;
}
main.cpp
#include <iostream>
#include "my_add.h"
#include "my_multiply_s.h"
using namespace std;

int main()
{
    int a = 6;
    int b = 2;
    cout << my_add(a,b) << endl;
    cout << my_multiply_s(a,b) << endl;
    return 0;
}
CMakeLists.txt
cmake_minimum_required (VERSION 3.22)

#是否清除缓存
if((CLEAR AND (${CLEAR} STREQUAL "1")) OR (clear AND (${clear} STREQUAL "1")))
    file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakeCache.txt")
    file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakefile")
    file(REMOVE_RECURSE "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakeFiles")
endif()

project (demo) 

if(NOT CMAKE_BUILD_PLATFORM)
    #定义编译位数
    set(CMAKE_BUILD_PLATFORM "-m64") 
    #set(CMAKE_BUILD_PLATFORM "-m32") 

    #定义编译类型
    set(CMAKE_BUILD_TYPE "debug") 
    #set(CMAKE_BUILD_TYPE "release")

    if(CMAKE_BUILD_PLATFORM)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_BUILD_PLATFORM}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_BUILD_PLATFORM}")
    endif()
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m64") AND (${CMAKE_BUILD_TYPE} STREQUAL "debug"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X64/Debug/${PROJECT_NAME}")
    endif()
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X64/Debug)
    set(LIB_STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../X64/Debug/liblib_static.a)
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m64") AND (${CMAKE_BUILD_TYPE} STREQUAL "release"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X64/Release/${PROJECT_NAME}")
    endif()
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X64/Release)
    set(LIB_STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../X64/Release/liblib_static.a)
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m32") AND (${CMAKE_BUILD_TYPE} STREQUAL "debug"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X86/Debug/${PROJECT_NAME}")
    endif()
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X86/Debug)
    set(LIB_STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../X86/Debug/liblib_static.a)
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m32") AND (${CMAKE_BUILD_TYPE} STREQUAL "release"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X86/Release/${PROJECT_NAME}")
    endif()
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X86/Release)
    set(LIB_STATIC ${CMAKE_CURRENT_SOURCE_DIR}/../X86/Release/liblib_static.a)
endif()

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/../lib_static
)

file(GLOB HEADER ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
file(GLOB SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

add_executable(
    ${PROJECT_NAME} 
    ${HEADER}
    ${SOURCE}
)

target_link_libraries(
    ${PROJECT_NAME}
    ${LIB_STATIC}   
)

静态链接库项目文件夹 lib_static

my_multiply_s.h
#ifndef __DEMO_MULTIPLY_S_H
#define __DEMO_MULTIPLY_S_H

#include <iostream>

int my_multiply_s(int a, int b);


#endif
my_multiply_s.cpp
#include "my_multiply_s.h"

int my_multiply_s(int a, int b)
{
    return a*b;
}
CMakeLists.txt
cmake_minimum_required (VERSION 3.22)

#是否清除缓存
if((CLEAR AND (${CLEAR} STREQUAL "1")) OR (clear AND (${clear} STREQUAL "1")))
    file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakeCache.txt")
    file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakefile")
    file(REMOVE_RECURSE "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakeFiles")
endif()

project (lib_static) 

if(NOT CMAKE_BUILD_PLATFORM)
    #定义编译位数
    set(CMAKE_BUILD_PLATFORM "-m64") 
    #set(CMAKE_BUILD_PLATFORM "-m32") 

    #定义编译类型
    set(CMAKE_BUILD_TYPE "debug") 
    #set(CMAKE_BUILD_TYPE "release")

    if(CMAKE_BUILD_PLATFORM)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_BUILD_PLATFORM}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_BUILD_PLATFORM}")
    endif()
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m64") AND (${CMAKE_BUILD_TYPE} STREQUAL "debug"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X64/Debug/lib${PROJECT_NAME}.a")
    endif()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X64/Debug)
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m64") AND (${CMAKE_BUILD_TYPE} STREQUAL "release"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X64/Release/lib${PROJECT_NAME}.a")
    endif()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X64/Release)
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m32") AND (${CMAKE_BUILD_TYPE} STREQUAL "debug"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X86/Debug/lib${PROJECT_NAME}.a")
    endif()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X86/Debug)
endif()

if((${CMAKE_BUILD_PLATFORM} STREQUAL "-m32") AND (${CMAKE_BUILD_TYPE} STREQUAL "release"))
    if(CLEAR OR clear)
        file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/../X86/Release/lib${PROJECT_NAME}.a")
    endif()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../X86/Release)
endif()

file(GLOB HEADER ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
file(GLOB SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

add_library(
    ${PROJECT_NAME} 
    STATIC
    ${HEADER}
    ${SOURCE}
)

编译64位Debug版本

1、修改根目录文件夹 demo 中的 CMakeLists.txt 文件

...
#定义编译位数
set(CMAKE_BUILD_PLATFORM "-m64") 
#set(CMAKE_BUILD_PLATFORM "-m32") 

#定义编译类型
set(CMAKE_BUILD_TYPE "debug") 
#set(CMAKE_BUILD_TYPE "release") 
...

2、执行cmake命令(在根目录文件夹 demo 中 build 文件夹目录)
2.1、清空缓存的方式

cmake -Dclear=1 ..

2.2、不清空缓存的方式

cmake -Dclear=0 ..

3、执行build命令(在根目录文件夹 demo 中 build 文件夹目录)

cmake --build .

编译64位Release版本

1、修改根目录文件夹 demo 中的 CMakeLists.txt 文件

...
#定义编译位数
set(CMAKE_BUILD_PLATFORM "-m64") 
#set(CMAKE_BUILD_PLATFORM "-m32") 

#定义编译类型
#set(CMAKE_BUILD_TYPE "debug") 
set(CMAKE_BUILD_TYPE "release") 
...

2、执行cmake命令(在根目录文件夹 demo 中 build 文件夹目录)
2.1、清空缓存的方式

cmake -Dclear=1 ..

2.2、不清空缓存的方式

cmake -Dclear=0 ..

3、执行build命令(在根目录文件夹 demo 中 build 文件夹目录)

cmake --build .

编译32位Debug版本

注:编译32位程序必须要g++支持!
1、修改根目录文件夹 demo 中的 CMakeLists.txt 文件

...
#定义编译位数
#set(CMAKE_BUILD_PLATFORM "-m64") 
set(CMAKE_BUILD_PLATFORM "-m32") 

#定义编译类型
set(CMAKE_BUILD_TYPE "debug") 
#set(CMAKE_BUILD_TYPE "release") 
...

2、执行cmake命令(在根目录文件夹 demo 中 build 文件夹目录)
2.1、清空缓存的方式

cmake -Dclear=1 ..

2.2、不清空缓存的方式

cmake -Dclear=0 ..

3、执行build命令(在根目录文件夹 demo 中 build 文件夹目录)

cmake --build .

编译32位Release版本

1、修改根目录文件夹 demo 中的 CMakeLists.txt 文件
注:编译32位程序必须要g++支持!

...
#定义编译位数
#set(CMAKE_BUILD_PLATFORM "-m64") 
set(CMAKE_BUILD_PLATFORM "-m32") 

#定义编译类型
#set(CMAKE_BUILD_TYPE "debug") 
set(CMAKE_BUILD_TYPE "release") 
...

2、执行cmake命令(在根目录文件夹 demo 中 build 文件夹目录)
2.1、清空缓存的方式

cmake -Dclear=1 ..

2.2、不清空缓存的方式

cmake -Dclear=0 ..

3、执行build命令(在根目录文件夹 demo 中 build 文件夹目录)

cmake --build .

VScode调试配置

1、使用VScode打开demo文件夹。
2、点击VScode左侧的调试按钮,点击"创建 launch.json 文件"。
3、编辑launch.json 文件

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/X64/Debug/exec",
            "args": [
                ""
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

注:需要将demo程序以debug模式编译,VScode才可以调试。

更多推荐