Windows系统下编译C++源码并调用

现在很多的C++库都以源码的形式在github网站开源,如果要使用,可以直接下载到本地,添加到工程中调用。也可以将源码编译为动态或静态库文件,然后将库文件添加到工程中。

在这里我们将GoogleTest源码编译,然后加到工程中。

一:下载配置CMake

配置CMake-CSDN博客

二:使用CMake编译源码

 通过cmd进入到GoogleTest源码的根目录下

在CMakeList.txt文件夹所在位置,使用cmake命令进行编译。

三:在CLion中构建,输出库文件

 使用CLion打开GoogleTest工程,依次选择四个module后编译,可以在指定位置找到编译后的库文件。

生成四个库文件,放置到工程的指定位置(自定义位置)

 四:将库文件对应的头文件放置到工程中。

在工程中创建include文件夹,用来存放头文件,起别的名称也可以。

因为生成四个、两类库文件,所有的头文件都要拷贝到工程中。

头文件在GoogleTest中的存放位置:

我在工程中存放头文件的路径,新建一个include文件夹,将源文件中两个include文件夹下的所有头文件保存到工程的inclu文件夹中。

五:修改CMakeList.txt文件

指定头文件路径;

指定静态链接库路径;

链接第三方库文件;

cmake_minimum_required(VERSION 3.25)

#支持的语言列表可以忽略,默认情况下表示支持所有语言。
#project(projectname [CXX] [C] [Java])

# CMake编译RadarDataController工程。
# 指定要构件的工程名称,在这里与CLion工程名相同。
project(RadarDataController)

#[[
  设置C++编译版本。CMAKE_CXX_STANDARD是cmake定义的宏,在这里指定版本宏为C++17版本。
  GoogleTest最低版本要求C++14,当前CPP编译版本为C++17。
]]
set(CMAKE_CXX_STANDARD 17)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# 下载cmake。测试报错。
# set(CMAKE_PREFIX_PATH "C:/ProgramFiles/cmake-3.30.2-windows-x86_64/bin/cmake")
set(CMAKE_PREFIX_PATH "C:/ProgramFiles/Qt/5.15.2/msvc2019_64/lib/cmake")

# 指定头文件路径。
include_directories(${PROJECT_SOURCE_DIR}/include/)

# 指定静态链接库路径。指定引用的外部库文件夹路径 用在add_executable或add_library之前。
link_directories(${PROJECT_SOURCE_DIR}/libs/)

# 链接第三方静态库。
link_libraries(gmock.lib;
    gmock_main.lib;
    gtest.lib;
    gtest_main.lib
)



find_package(Qt5 COMPONENTS
    Core
    Gui
    Widgets
    REQUIRED
)

# 屏蔽warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
# 屏蔽warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。

#add_library(gtest gtest_main)

#[[
  测试将可执行程序与编译文件分离。
  1:定义变量CPP_LIST将文件名对应的字符串存储起来。在这里文件是程序的header文件和source文件。
  2:可执行程序RadarDataController调用变量CPP_LIST中的文件。
]]
set(CPP_LIST;
    main.cpp;
    data/constant_variable.cpp
    data/constant_variable.h
    data/air_net_track_data.cpp
    data/air_net_track_data.h
    data/base_track_data.cpp
    data/base_track_data.h
    handle/air_net_track_data_handler.cpp
    handle/air_net_track_data_handler.h
    form/main_window.cpp
    form/main_window.h
    form/main_window.ui
    handle/main_window_handler.cpp
    handle/main_window_handler.h
    base_process/main_window_event.cpp
    base_process/main_window_event.h
    handle/base_track_data_handler.cpp
    handle/base_track_data_handler.h
    handle/base_track_data_handler.h
    base_process/base_track_data_processor.cpp
    base_process/base_track_data_processor.h
    cat_62_process/cat_62_fspec_processor.cpp
    cat_62_process/cat_62_fspec_processor.h
    data/cat_62_record_enum.cpp
    data/cat_62_record_enum.h
    data/hex_integer.cpp
    data/hex_integer.h
    data/hex_integer.h
    base_process/base_header_processor.cpp
    base_process/base_header_processor.h
    cat_62_process/cat_62_header_processor.cpp
    cat_62_process/cat_62_header_processor.h
    base_process/base_length_processor.cpp
    base_process/base_length_processor.h
    base_process/base_length_processor.h
    cat_62_process/cat_62_length_processor.cpp
    cat_62_process/cat_62_length_processor.h
    base_process/base_fspec_processor.cpp
    base_process/base_fspec_processor.h
    cat_62_process/cat_62_data_source_identifier_processor.cpp
    cat_62_process/cat_62_data_source_identifier_processor.h
    cat_62_process/cat_62_data_source_identifier_processor.h
    cat_62_process/cat_62_service_identification_processor.cpp
    cat_62_process/cat_62_service_identification_processor.h
    cat_62_process/time_of_track_information_processor.cpp
    cat_62_process/time_of_track_information_processor.h
    cat_62_process/cat_62_track_position_wgs_84.cpp
    cat_62_process/cat_62_track_position_wgs_84.h
    cat_62_process/cat_62_track_number_processor.cpp
    cat_62_process/cat_62_track_number_processor.h
    cat_62_process/cat_62_track_mode_code_processor.cpp
    cat_62_process/cat_62_track_mode_code_processor.h
    cat_62_process/cat_62_track_mode_code_processor.h
    cat_62_process/cat_62_track_position_cartesian.cpp
    cat_62_process/cat_62_track_position_cartesian.h
    cat_62_process/cat_62_track_velocity.cpp
    cat_62_process/cat_62_track_velocity.h
    cat_62_process/cat_62_acceleration.cpp
    cat_62_process/cat_62_acceleration.h
    cat_62_process/cat_62_track_status.cpp
    cat_62_process/cat_62_track_status.h
    cat_62_process/cat_62_target_identification.cpp
    cat_62_process/cat_62_target_identification.h
)

add_executable(RadarDataController;
    ${CPP_LIST}
)

# 指定要生成的可执行文件名称RadarDataController。
# 指定生成可执行文件需要的源文件,包括header file和source file。原文件之间可以使用空格或符号“;”进行文件划分。
#add_executable(RadarDataController;
#    main.cpp;
#    data/constant_variable.cpp
#    data/constant_variable.h
#    data/air_net_track_data.cpp
#    data/air_net_track_data.h
#    data/base_track_data.cpp
#    data/base_track_data.h
#    handle/air_net_track_data_handler.cpp
#    handle/air_net_track_data_handler.h
#    form/main_window.cpp
#    form/main_window.h
#    form/main_window.ui
#    handle/main_window_handler.cpp
#    handle/main_window_handler.h
#    base_process/main_window_event.cpp
#    base_process/main_window_event.h
#    handle/base_track_data_handler.cpp
#    handle/base_track_data_handler.h
#    handle/base_track_data_handler.h
#    base_process/base_track_data_processor.cpp
#    base_process/base_track_data_processor.h
#    cat_62_process/cat_62_fspec_processor.cpp
#    cat_62_process/cat_62_fspec_processor.h
#    data/cat_62_record_enum.cpp
#    data/cat_62_record_enum.h
#    data/hex_integer.cpp
#    data/hex_integer.h
#    data/hex_integer.h
#    base_process/base_header_processor.cpp
#    base_process/base_header_processor.h
#    cat_62_process/cat_62_header_processor.cpp
#    cat_62_process/cat_62_header_processor.h
#    base_process/base_length_processor.cpp
#    base_process/base_length_processor.h
#    base_process/base_length_processor.h
#    cat_62_process/cat_62_length_processor.cpp
#    cat_62_process/cat_62_length_processor.h
#    base_process/base_fspec_processor.cpp
#    base_process/base_fspec_processor.h
#    cat_62_process/cat_62_data_source_identifier_processor.cpp
#    cat_62_process/cat_62_data_source_identifier_processor.h
#    cat_62_process/cat_62_data_source_identifier_processor.h
#    cat_62_process/cat_62_service_identification_processor.cpp
#    cat_62_process/cat_62_service_identification_processor.h
#    cat_62_process/time_of_track_information_processor.cpp
#    cat_62_process/time_of_track_information_processor.h
#    cat_62_process/cat_62_track_position_wgs_84.cpp
#    cat_62_process/cat_62_track_position_wgs_84.h
#    cat_62_process/cat_62_track_number_processor.cpp
#    cat_62_process/cat_62_track_number_processor.h
#    cat_62_process/cat_62_track_mode_code_processor.cpp
#    cat_62_process/cat_62_track_mode_code_processor.h
#    cat_62_process/cat_62_track_mode_code_processor.h
#    cat_62_process/cat_62_track_position_cartesian.cpp
#    cat_62_process/cat_62_track_position_cartesian.h
#    cat_62_process/cat_62_track_velocity.cpp
#    cat_62_process/cat_62_track_velocity.h
#    cat_62_process/cat_62_acceleration.cpp
#    cat_62_process/cat_62_acceleration.h
#    cat_62_process/cat_62_track_status.cpp
#    cat_62_process/cat_62_track_status.h
#    cat_62_process/cat_62_target_identification.cpp
#    cat_62_process/cat_62_target_identification.h
#)

# 链接动态库。
target_link_libraries(RadarDataController
    Qt5::Core;
    Qt5::Gui;
    Qt5::Widgets;
)

if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(DEBUG_SUFFIX)
    if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()
    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E make_directory
            "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
            "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()
    foreach (QT_LIB Core Gui Widgets)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            "${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll"
            "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
    endforeach (QT_LIB)
endif ()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值