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

news2024/11/24 18:08:29

现在很多的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 ()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL(三)着色器语言GLSL

着色器语言 在GPU上运行的图形渲染语言&#xff0c;类C风格。 类似于CUDA&#xff0c;但是又没有CUDA通用&#xff0c;又有点像Verilog这种硬件描述语言 GLSL是一种着色器语言&#xff0c;需要有对应的图形API环境配合&#xff0c;可以使用OpenGL&#xff0c;也可以使用OpenGL…

Proteus仿真综合实例(1)

分享一些基于Proteus的仿真实例&#xff0c;供大家学习参考。 1、51单片机230个Proteus仿真实例 包含基于51单片机的230个仿真实例&#xff0c;涉及定时器、中断、LCD显示、DS18B20温度测量、DS1621温度测量、PWM生成等充足电路模型案例。 2、51交通灯 模拟实现基于51单片机…

音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件

在文章《音视频入门基础&#xff1a;PCM专题&#xff08;1&#xff09;——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件&#xff1a; ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…

《论层次架构及其在软件系统中的应用》写作框架,软考高级系统架构设计师

论文真题 层次架构作为软件系统设计的一种基本模式&#xff0c;对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中&#xff0c;采用层次架构不仅可以使系统结构更加清晰&#xff0c;还有助于提高开发效率和质量。因此&#xff0c;对层次架…

【笔记】2.2 黏土类原料

黏土类原料&#xff0c;用于制备陶瓷、耐火材料和水泥&#xff0c;为制品成型提供必须的可塑性&#xff0c;悬浮性。 2.2.1 黏土的成因和分类 黏土主要成分&#xff1a;含水硅铝酸盐 黏土形成&#xff1a;硅铝酸盐岩石经过长期地质时代的自然风化或热液蚀变作用而逐步形成。…

Elasticsearch-数据迁移elasticdump

一、环境信息 主机名 IPelasticsearch-master10.10.10.1elasticsearch-slave10.10.10.2 二、互联网部分 2.1、Nodejs下载安装&#xff08;master节点&#xff09; #官网&#xff1a;Download | Node.js #下载nodejs包 [rootelasticsearch-master home]# wget -c htt…

协议头,wireshark,http

目录 协议头 ip头 udp头 mac层 网络工具 telnet wireshark Http 一、HTTP 协议介绍 二、HTTP 协议的工作过程 三、使用抓包工具抓取报文 四、获取到http请求报文&#xff1a; 五、http请求&#xff08;request&#xff09; &#xff08;一&#xff09;、认识URL 项…

Redis 入门 - 五大基础类型及其指令学习

经过前面Redis入门系列三篇文章学习&#xff0c;相信大家已经准备好学习新知识了&#xff0c;到这里也算是真正开始学习Redis了。学习了软件安装&#xff0c;客户端选择&#xff0c;那么接下来也应该来了解Redis有什么&#xff0c;能干什么。 我们在第一章中就说过&#xff0c…

线程的六种状态

优质博文&#xff1a;IT-BLOG-CN 线程的状态在Thread.State这个枚举类型中定义&#xff1a;共有6种状态&#xff0c;可以调用线程Thread种的getState()方法获取当前线程状态。 public enum State { /** * 新建状态(New)&#xff1a; * 当用new操作符创建一个线程时&#…

C++第五节 - this指针、构造函数、析构函数

一、类对象的存储方式 只保存成员变量&#xff0c;成员函数存放在公共的代码段 注意点&#xff1a; #include<iostream> using namespace std; class A { public:void PrintA(){cout << _a << endl;} private:char _a; }; int main() {class A a;cout <…

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…

django学习入门系列之第十点《A 案例: 员工管理系统4》

文章目录 6 部门管理&#xff08;原始方式&#xff09;6.6 添加界面的导入&#xff08;数据库&#xff09;6.7 删除按键的应用6.8 编辑按键的应用6.81 传值的另一种方式 6.9 提交按键的应用 往期回顾 6 部门管理&#xff08;原始方式&#xff09; 6.6 添加界面的导入&#xff…

E32.【C语言 】练习:蓝桥杯题 懒羊羊字符串

1.题目 【问题描述】 “懒羊羊”字符串是一种特定类型的字符串&#xff0c;它由三个字符组成&#xff0c;具有以下特点: 1.字符串长度为 3. 2.包含两种不同的字母。 3.第二个字符和第三个字符相同 换句话说&#xff0c;“懒羊羊”字符串的形式应为 ABB&#xff0c;其中A和B是不…

【python2C】算法基础:计时比较

不断改进代码&#xff0c;是学习进步必经之路。 判断代码优劣&#xff0c;在空间允许的情况下&#xff0c;计时就是最可靠的标尺。 打表不算&#xff0c;人脑不算 1.对于答案较为固定的题&#xff0c;预先算出所有可能的答案表&#xff0c;然后对应输入查找答案&#xff0c;从…

【OpenGL 002】着色器 GLSL 语言及GLFW代码案例

文章目录 1.GLSL语言简介本节案例 code 1 2.GLSL的数据类型① 向量(Vector)- 向量重组示例- 向量重组禁忌 3.GLSL的输入输出本节案例 code 2 4.着色器示例5.Uniform本节案例 code 3 通过第一节 【OpenGL 001】Ubuntu 搭建 GLFW 环境及其相关测试 demo 想必已经搭建好了GLFW环境…

『功能项目』GameObject对象池 - 第三职业【39】

本章项目成果展示 我们打开上一篇38管理器基类的项目&#xff0c; 本章要做的事情是利用对象池制作第三个职业——魔法师 在GameRoot对象下创建空物体 重命名为PoolRoot 将GameRoot拖拽至预制体 创建脚本&#xff1a; 编写脚本&#xff1a;PoolManager.cs using UnityEngine;…

使用豆包MarsCode 编写 Node.js 全栈应用开发实践

以下是「豆包MarsCode 体验官」优秀文章&#xff0c;作者狼叔。 欢迎更多用户使用豆包MarsCode 并分享您的产品使用心得及反馈、创意项目开发等&#xff0c;【有奖征集&#xff5c;人人都是豆包MarsCode 测评官&#xff01;】活动正在火热进行中&#xff0c;欢迎大家投稿参加&a…

【Python报错已解决】 SyntaxError: invalid syntax

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;修复缺失的括号或引号2.…

甘肃五仁月饼:传统风味,舌尖上的乡愁

在中秋佳节的美食画卷中&#xff0c;甘肃食家巷五仁月饼以其独特的魅力占据着重要的一席之地。甘肃五仁月饼&#xff0c;那朴实无华的外表下&#xff0c;藏着无尽的美味与情怀。它的饼皮金黄酥脆&#xff0c;散发着淡淡的麦香&#xff0c;仿佛在诉说着古老的制作工艺。轻轻咬上…

Java:动态代理

Java&#xff1a;动态代理 什么是代理 代理模式 是一种设计模式&#xff0c;它为其他对象提供了一种代理以控制对这个对象的访问。代理对象通常包装实际的目标对象&#xff0c;以提供一些附加的功能&#xff08;如延迟加载、访问控制、日志记录等&#xff09;。我们一般可以使…