关于本帖的各个模块组成先解释一下

 vscode本质上是个编辑器,只能用于编辑文本,本体功能类似于notpad++,它并不是个像 vs那样的集成开发环境,MinGW是将g++等一系列用于在linux上编译c/c++的编译器适配到windows平台的编译器,windows平台有自己的编译器叫msvc不过用vscode的人一般不用msvc

cmake是用于生成makelist文件的构建器,makelist的作用是简化makefile的书写.

编译程序最终调用的是make指令,这个对应的是makefile,makefile可以人为书写,不过语法相对难懂,可以通过cmake生成的makelist来自动生成makefile,makelist的语法就简单多了

这里附上一篇个人感觉很全的cmake教程(虽然我本人也并没有全部看完)

cmake 教程

好了知道上面的模块了,就可以进入主题了(关于如何安装vscode跟配置minGW的环境变量这个我就不写了,网上太多了),这里说几个vscode插件

C/C++  Cmake Tools必须安装,其余的随意,有些插件就是改变了目录的颜色,这些可以自己去找找,跟本文主旨无关

首先声明,本人使用vscode编译C++时间甚短,关于vscode的很多配置不是很明白,不过以下的示例都经过验证,可帮助小白快速入手

vscode在调试程序这块关于工作区的问题

一简易使用篇: 直接使用g++指令编译程序

如图:

 将如下代码拷贝到新建的cpp文件内

#include<iostream>
using namespace std;
int main(){
    cout << "hello echo" << endl;
    system("pause");
}

此时你的工作区应该是这样的(除了.vscode文件夹)

 关于这个.vscode文件夹其实不必太过关心,用多了自然就知道是干嘛的,主要就是存放launch.json,tasks.json等启动,调试,任务文件的.

下面手动创建.vscode目录

 然后将如下文件复制到.vscode目录下(文件名不要出错)

 c_cpp_properties.json (修改compilerPath)

{
    "configurations": [
        {
            "name": "MinGW64",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "D:/C++IDE17_19_22/vscode/mingw64/bin/gdb.exe",
            "includePath": [
                "${workspaceFolder}"
            ],
            "cppStandard": "c++17"
        }
    ],
    "version": 4
 } 

launch.json (注意program,cwd,miDebuggerPath)

{  
    "version": "0.2.0",  
    "configurations":
    [  
        {  
            "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示  
            "type": "cppdbg",       // 配置类型,这里只能为cppdbg  
            "request": "launch",    // 请求配置类型,可以为launch(启动)或attach(附加)  
            "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",// 将要进行调试的程序的路径  
            "args": [],             // 程序调试时传递给程序的命令行参数,一般设为空即可  
            "stopAtEntry": false,   // 设为true时程序将暂停在程序入口处,一般设置为false  
            "cwd": "${workspaceFolder}", // 调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录  
            "environment": [],  
            "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台  
            "MIMode": "gdb",  
            "miDebuggerPath": "D:/C++IDE17_19_22/vscode/mingw64/bin/gdb.exe", // miDebugger的路径,注意这里要与MinGw的路径对应  
            "preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc  
            "setupCommands":
            [  
                {   
                "description": "Enable pretty-printing for gdb",  
                "text": "-enable-pretty-printing",  
                "ignoreFailures": true  
                }  
            ]  
        }  
    ]  
}

tasks.json(注意command, options)

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "g++", //这里注意一下,见下文
            "command": "D:/C++IDE17_19_22/vscode/mingw64/bin/g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-ggdb3",   // 生成和调试有关的信息
                "-Wall",    // 开启额外警告
                "-static-libgcc",   // 静态链接
                "-std=c++17",       // 使用c++17标准
                "-finput-charset=UTF-8",    //输入编译器文本编码 默认为UTF-8
                "-fexec-charset=GB18030",   //输出exe文件的编码
                "-D _USE_MATH_DEFINES"
            ],
            "options": {
                "cwd": "D:/C++IDE17_19_22/vscode/mingw64/bin/"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "presentation": {
                "echo": true,
                "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never
                 "focus": false,
                 "panel": "shared" // 不同的文件的编译信息共享一个终端面板
            },
        }
    ]
}

这几个文件大概的功能这里说明一下

C_Cpp_Properties.json是用于配置编译器环境的,包括启动器代号、位数(这些是自定义的)、编译选项、启动设置、编译模式等。includePath指向C/C++标准库、用户头文件所在位置。
不需要CMake也可以直接编写C/C++

launch.json是vscode用于调试的配置文件,比如指定调试语言环境,指定调试类型等等,这个文件在首次运行F5(跟vs相同的调试指令)时会让你创建该文件

tasks.json 这个配置文件是用来执行你预定的任务的,比如说你修改了你的代码,调试之前,肯定要重新生成新的程序后再调试,那么你就可以配置它告诉vscode怎么重新生成这个新的程序

vscode就是先跑 tasks.json 任务,再跑 launch.json。

下面就运行tasks.json, (组合键 ctrl + shift + p  或者直接F1键)

 这里的g++就是tasks.json的lable的名字

 可以看到生成了test.exe文件

下面进行调试,直接F5进入调试(记得打断点)

以上

二项目篇 cmake构建项目

这里准备做的是创建一个dll项目,一个demo项目,使用demo调用dll的导出函数,当然了,不想看dll的可以略过部分内容

好了跟上面一样先创建一个目录用于存放demo跟dll文件夹,我这里创建的是wook6,参照上面的方法,先给wook6文件夹添加工作区,然后在wook6文件夹里面创建bin目录,demo目录,dll目录,此时的工作区如下(除了.vscode目录)

这时候在wook6目录下,也就是在wook6工作区中存在bin,demo,dll三个文件夹,由于vscode的命令面板执行的各种任务仅能在当前工作区生效,因此为了让demo项目在demo文件夹下生成,dll项目在dll文件夹下生成,需要为demo,dll文件夹分别添加工作区,添加工作区的方法如下

 上面的步骤执行结束后,vscode的目录如下

 那么现在发生什么事了呢,可以通过 ctrl + r 切换工作区,现在把工作区切换回wook6

 此时的目录如下

 这样一来就可以通过切换工作区的方式来指定vscode当前的工作目录

好了,按照这个方法,把demo文件夹也添加工作区

下面开始通过cmake构建demo项目

ctrl+ r 进入 demo工作区,F1或者 ctrl + shift + p 打开命令面板 ,选择cmake入门

选择你配置的mingw GCC编译版本

 输入项目名字,这里是demo

 选择下面Executable ,创建exe程序,上面这个library是用于创建链接库程序,如lib库跟dll库

 执行完上面的步骤后目录应该如下

 这个目录下面的文件由cmake构建创建,CmakeLists.txt就是cmake的语法文件,用于生成makefile文件的(此时没有.vscode目录没关系),现在cmake已经为我们构建出项目了,接下来要做的就是执行cmake指令,编译出我们的程序

main.cpp就是本项目唯一的源文件,里面就是默认的 打印hello world,没什么可多说的

如何执行cmake指令呢

通过F1或者组合键打开命令面板,选择配置任务

 在列表最下面找到使用模板创建tasks.json文件

 选择maven

 此时在demo目录下面会生成.vscode目录,且在该目录下有tasks.json文件

看看此时的tasks.json文件内容是什么

 这内容并没什么用,不过这个文件有用,vscode通过检索.vscode目录下的tasks.json文件来执行指令,label就是指令的名字,下面将如下语句替换到 label : test 的 command下

cd ${workspaceFolder}/build ; Remove-Item -r CMakeFiles ; cmake .; make

 此时应为

 可以看到tasks.json中使用的类型是shell,准确的说是windows下的powershell,所以command后面加的就是powershell的指令,这条指令什么意思呢,就是进入当前工作区的build目录,删除CMakeFiles文件夹,然后执行cmake根据当前目录配置生成makefile,再调用make指令执行makefile文件构建项目,关于这条指令可能会出现错误的地方是 删除文件夹部分,这个自己根据shell还是cmd自行修改

可以看到我上面把任务的名字改成了test-demo-build,下面就执行这个任务

还是通过命令面板

 

 这两个任务就是在tasks.json中配置的,不过因为我们只配置了一个任务,另一个任务目前是无意义的,选择执行test-demo-build

 下面验证下生成的demo.exe是否可以运行,当然了有两种方法

一是直接在命令行执行,如下,右击build目录,将其在集成终端打开

可以看到vscode为我们新起了一个powershell终端,且运行目录也在build下

 输入 ./de 之后可通过tab键补全名称,回车键确认,执行完是这样

 注意,ps是powershell的简称

可以看到生成的demo.exe文件可以执行,当然了最粗暴的方式是直接在文件夹下双击运行,不过默认的main.cpp没有加暂停功能,运行程序会一闪而过,想要通过此方式查看运行效果可以在main.cpp中添加 system("pause")代码,不过添加该代码后在命令行运行会出现无法关闭demo.exe的bug,如果出现该bug可在任务管理器里强制关闭demo.exe进程,当然了这些都是题外话,是我遇到的一些坑,你不一定会遇到,不知道也没关系

二调试执行demo.exe程序

 通过该步骤可以生成launch.json文件,将如下复制粘贴,需注意miDebuggerPath

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {  
            "name": "(gdb-demo) Launch", // 配置名称,将会在启动配置的下拉菜单中显示  
            "type": "cppdbg",       // 配置类型,这里只能为cppdbg  
            "request": "launch",    // 请求配置类型,可以为launch(启动)或attach(附加)  
            "program": "${workspaceFolder}/build/demo.exe",// 将要进行调试的程序的路径  
            "args": [],             // 程序调试时传递给程序的命令行参数,一般设为空即可  
            "stopAtEntry": false,   // 设为true时程序将暂停在程序入口处,一般设置为false  
            "cwd": "${workspaceFolder}", // 调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录  
            "environment": [],  
            "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台  
            "MIMode": "gdb",  
            "miDebuggerPath": "D:/C++IDE17_19_22/vscode/mingw64/bin/gdb.exe", // miDebugger的路径,注意这里要与MinGw的路径对应  
            "preLaunchTask": "test-demo-build", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc  
            "setupCommands": [  
                {   
                    "description": "Enable pretty-printing for gdb",  
                    "text": "-enable-pretty-printing",  
                    "ignoreFailures": true  
                }  
            ]  
        }  
    ]
}

好了现在可以调试程序了,vscode跟vs的调试命令完全一样,通过F5调试

 可以看到调试成功,vscode进入断点

好了以上关于demo项目的配置就全部结束了,注意,目前的编译,调试都是在demo的工作区内完成的,下面要切换工作区到dll

通过ctrl + r切换工作区

通过cmake构建dll项目

构建dll跟构建demo项目基本一样,这里只用文字说明进行了那些步骤,具体执行后的结果可参照demo的构建

首先确认当前的工作区已经切换到dll目录,F1(ctrl + shift + p)打开命令面板,选择CMake:快速入门,

输入项目名字,dll,选择创建library项目

 此时项目应该如上

如果你知道C++的链接库知识应该会产生疑惑,C++的链接库分为两种,一种是lib(a)库,也就是静态库,采用的是编译时链接,仅能在C/C++语言内部使用, 一种是dll(so)库,也就是动态库,采用的是运行时链接,支持其他多种语言调用,我们这里创建的是dll,为什么没有什么设置之类的,如何确定生成的是动态库呢,好带着这个疑问接下去慢慢看

如果熟悉C++链接库的知识,应该知道,C++链接库有两种链接方式,其中一种隐式调用链接库的方式就需要有库的头文件,目前的项目里面仅有一个cpp源文件,因此还需手动创建一个头文件(如果用显示调用方式则不需要头文件,但是需要用到loadlibaray,getaddress之类的函数获取接口的地址)

下面创建dll.h头文件,内容如下

#ifndef DLL_H
#define DLL_H

void say_hello();

#endif

接下来通过命令面板,给dll项目添加tasks.json,步骤跟创建demo项目时一样  : F1 -> 任务:配置任务 ->使用模板创建tasks.json文件 -> maven

将cd ${workspaceFolder}/build ; Remove-Item -r CMakeFiles ; cmake .; make 替换进去,如下

 运行这个test  task(在命令面板 -> 任务:运行任务->test),然后去build目录下找生成的文件,如下图

  

 可以看到此时生成了一个后缀式.a的文件,说明这是生成了静态库文件,既然生成了,那就调用一下看看这个文件能不能使用吧

将工作区切换到wook6,即最开始的目录下,如图

 如何让demo调用dll生成的库文件呢,下面需要修改demo项目的cmakelists,内容如下

#当前工作目录
MESSAGE(STATUS "Current path : ${CMAKE_CURRENT_SOURCE_DIR}")
cmake_minimum_required(VERSION 3.0.0)
project(demo VERSION 0.1.0)


#链接库的目录,可用相对路径
link_directories(../dll/build)
#配置头文件目录
include_directories(../dll)

add_executable(demo main.cpp)

#链接使用的库
target_link_libraries(${PROJECT_NAME} libdll.a)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})

上述设置了demo项目将要使用的库目录,库文件目录以及链接库命令

在demo项目的main.cpp文件中修改如下

#include <iostream>
#include "dll.h"


int main(int, char**) 
{
    using namespace std;
    
    std::cout << "Hello, world!\n";
    say_hello();
    system("pause");
}

下面将工作区切换到demo,F1运行编译任务,在F5运行调试任务,具体运行结果如下

上面表明demo调用dll生成的静态库文件成功

那么问题来了,我需要生成的是动态库,这里为什么生成的是静态库呢,下面通过修改cmake指令编译生成动态库

指定dll项目为动态库项目

好了现在将工作区切换到dll

修改dll的cmakelist如下

cmake_minimum_required(VERSION 3.0.0)
project(dll VERSION 0.1.0)

include(CTest)
enable_testing()

#[[命令:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
libname:生成的库文件的名字
​[SHARED|STATIC|MODULE]:生成库文件的类型(动态库|静态库|模块)
[EXCLUDE_FROM_ALL]:有这个参数表示该库不会被默认构建​
source2 ... sourceN:生成库依赖的源文件,如果源文件比较多,可以使用​aux_sourcr_directory命令获取路径下所有源文件.]]
add_library(dll SHARED dll.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

注意cmake默认生成静态库项目,动态库需显式指定

下面执行dll的编译task,结果如下

 好了现在问题来了,为什么出现了两个.a文件,一个.dll文件 ,还有为什么是.a

先说为什么是.a 

.a .so是linux系统下的库后缀名,分别对应windows下的.lib,.dll ,因为这里使用minGW进行编译的原因,该平台移植自linux,所以中间文件沿用的.a后缀,可以看到最终文件动态库使用的是.dll,因为.a文件在编译时被链接进程序,成为程序的代码,可以不明确区分操作系统版本,只要你的编译器认识就行,而在运行过程中,需要操作系统去加载动态库,所以这里还是以windows认识的.dll后缀作为动态库文件名

这涉及到链接库的知识,这里简单说明一下: 动态库在被链接时有两种方式,具体的调用方法参考如下链接  动态库库的两种链接调用方式

可以看到,动态库也有一个相应的.lib库,这个库准确的讲不能叫静态库,叫动态库导入库,里面仅有动态库的符号表及函数地址,跟真正的静态库完全不同

好了上面生成了动态库,下面还是把工作区切换到demo,仅需修改makelist中链接库的名字即可

执行编译指令,生成成功

注意,动态库的使用需要将dll文件放置到demo.exe同一目录层级,将libdll.dll拷贝到demo.exe目录

 F5执行launch任务,如下

 上述表示demo调用动态库文件成功,并对demo进行了调试

好了现在本教程已经完成了绝大部分了,还有最最重要的一步,调试动态库

最后一步,调试动态库

调试动态库需要稍微修改demo代码以便于让调试器可以附加进入demo程序,修改后如下

#include <iostream>
#include "dll.h"

int main(int, char**) 
{
     using namespace std;
    cout << "请选择输入数字执行指令" << endl;
    cout << "0 -------------- 退出程序" << endl;
    cout << "1 -------------- 调用动态库接口say_hello()" << endl;
    int in = 10086;
    while (in != 0)
    {
        cout << "输入数字:" ;
        cin >> in;
        if(in == 1)
        {
            say_hello();
        }
        else if (in == 0)
        {
            break;
        }    
    }
    return 0;
}

好了修改完后进行编译任务,并F5运行一下,可以看到如下问题

中文出现乱码,这是编码问题,vscode默认使用UTF-8编码,而windows的cmd窗口默认使用本地编码,因为我切换了windeos语言为中文系统,所以默认的是ANIS码,也就是GBK,虽然从主流上讲,使用UTF编码更适合跨平台项目(多数平台默认宽字符编码UTF-8),不过国内的软件开发多数使用的编码仍然是GBK,关于GBK,GB2312 ,GB18030,只要知道是后者兼容前者

下面给makelist添加如下设置

#设置以本地GBK编码编译程序,解决中文乱码问题
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -finput-charset=GBK")
#设置输出文件编码为GBK,解决中文乱码问题
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=GBK")

为什么这样设置,选择打开任何带有代码的文件,可以看到如下

 说明vscode默认使用UTF编码来保存文件,上述第一条就是告诉编译器,编译文件编码全部是GBK      设置编码参考

下面那条命令告诉编译器将生成文件的所有输出改成GBK编码

将main.cpp编码改成GBK

如此设置后如下图

接下来运行编译任务和调试任务

 好了,现在demo已经改好了,下面要对动态库进行调试

将工作区切换到dll

在.vscode中创建launch.json文件,内容如下

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {  
            "name": "dll_attach", // 配置名称,将会在启动配置的下拉菜单中显示  
            "type": "cppdbg",       // 配置类型,这里只能为cppdbg  
            "request": "attach",    // 请求配置类型,可以为launch(启动)或attach(附加)  
            "program": "D:/vscode-workspace/wook6/demo/build/demo.exe",// 将要进行调试的程序的路径  
            "processId": "${command:pickProcess}",
            "MIMode": "gdb",  
            "miDebuggerPath": "D:/C++IDE17_19_22/vscode/mingw64/bin/gdb.exe", // miDebugger的路径,注意这里要与MinGw的路径对应  
            //"preLaunchTask": "test-demo-build", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc  
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }  
    ]
}

dll调试实在难以搞定,暂无教程

附录: 常用的cmake指令

#设置c++编译器
set(CMAKE_CXX_COMPILER "g++")

#CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置;
#CMAKE_LIBRARY_OUTPUT_DIRECTORY:默认存放动态库的文件夹位置;
#LIBRARY_OUTPUT_PATH:默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下,动态库也类似;
#CMAKE_RUNTIME_OUTPUT_DIRECTORY:存放可执行软件的目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ../../test)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../../test)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../../test)

#设置可执行文件的版本为debug还是release
set(CMAKE_BUILD_TYPE "Debug")
#set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_definitions(-std=c++11)


#定义变量,存储当前目录下的所有源文件
aux_source_directory(. ALL)
#当源文件较多时,通过设置变量来指定需要编译的源文件
set(GIVEN_LIST dll.cpp)

#[[命令:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
libname:生成的库文件的名字
​[SHARED|STATIC|MODULE]:生成库文件的类型(动态库|静态库|模块)
[EXCLUDE_FROM_ALL]:有这个参数表示该库不会被默认构建​
source2 ... sourceN:生成库依赖的源文件,如果源文件比较多,可以使用​aux_sourcr_directory命令获取路径下所有源文件.]]
#add_library(dll SHARED dll.cpp)
#add_library(dll SHARED ${GIVEN_LIST})
add_library(dll SHARED dll.cpp)


#重定义输出dll的名字
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "dll")   #重命名后的文件名前面依旧会加上lib三个字符

#2、设置cmake编译语言
set(CMAKE_CXX_STADARD 11)
#启用语法检查
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(dllTest VERSION 0.1.0)

#设置c++编译器
set(CMAKE_CXX_COMPILER "g++")

#6、WIN特有的bug,windows.h会定义下面两个宏,导致std::min和std::max用不了,所以要添加
if(WIN32)
    add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES)
endif()


#设置以本地GBK编码编译程序,解决中文乱码问题
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -finput-charset=GBK")
#设置输出文件编码为GBK,解决中文乱码问题
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=GBK")

#链接库的目录,可用相对路径
#link_directories(./)
#配置头文件目录
#include_directories(../dll)
#设置可执行文件的版本为debug还是release
set(CMAKE_BUILD_TYPE "Debug")
#set(CMAKE_BUILD_TYPE "Release")
#生成调试文件
#set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
#set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
#add_definitions(-std=c++11)

#CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置;
#CMAKE_LIBRARY_OUTPUT_DIRECTORY:默认存放动态库的文件夹位置;
#LIBRARY_OUTPUT_PATH:默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下,动态库也类似;
#CMAKE_RUNTIME_OUTPUT_DIRECTORY:存放可执行软件的目录
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ../../bin)
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../../bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../)


add_executable(dllTest main.cpp)

#链接使用的dll库
#target_link_libraries(${PROJECT_NAME} libdll.dll.a)

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐