一、windows有关Visual studio的一些使用

1.1 Visual studio搜索库文件的顺序

1.1.1 VS包含目录、附加包含目录和库目录和附加库目录

  • 头文件包含路径:即所谓的 包含目录 或者是 附加包含目录 (.h)
  • 库文件路径:即所谓的 库目录 或者是 附加库目录 (.lib)路径
  • 附加链接库:附加依赖项(指定.lib名称)

1.1.2 DLL的搜索顺序

  • 应用程序所在目录;
  • 系统目录。GetSystemDirectory返回的目录,通常是系统盘\Windows\System32;
  • 16位系统目录。该项只是为了向前兼容的处理,可以不考虑;
  • Windows目录。GetWindowsDirectory返回的目录,通常是系统盘\Windows;
  • 当前目录。GetCurrentDirectory返回的目录;
  • 环境变量PATH中所有目录。

1.1.3 头文件的查找顺序

  • 当前目录
  • 在项目属性中的Additional Include Directories中(在C++ | General下)。属性->配置属性->C/C++ -> 常规-> 附加包含目录
  • 在Visual Studio C++ 包含目录 在 工具 → 选项 → 项目和解决方案 → VC++目录 。属性->配置属性->VC++目录 -> 包含目录
  • 在新版本的Visual Studio(2015+)中,不推荐使用上述选项,并且可以在项目属性 → 配置 → VC++目录中找到默认包含目录的列表
  • 系统环境变量

1.1.4 lib搜索的顺序

  • 源文件代码所在的文件夹中寻找库文件(即静态库文件);
  • 在使用MSVC编译的时候,通过参数 /link 来指定的搜索目录;(相当于是“附加库目录”设置的)属性->配置属性->链接器 -> 常规-> 附加包含目录。
  • 通过 LIB 环境变量指定的搜索目录;(相当于是“库目录”设置的)属性->配置属性->VC++目录 -> 包含目录。
  • windows环境变量

1.2 静态库与动态库

1.2.1 关键点

  • windows下的静态库.lib,引用时只需要指定.lib的位置
  • windows下的动态库.dll和.lib,引用时需要引入lib和dll文件,其中lib中主要包含的是一些索引信息,编译过程中会被链接;dll中包含的是一些具体实现,运行的时期才会被调用。这也是为什么dll放在exe目录下可以运行,也是为什么运行时侯报0x0000007b多数时候是dll引用不对或没有引用上。

1.2.2 在visual studio的引用

静态库的引用

  • 指定.h文件路径:属性->配置属性->VC++目录->包含目录
  • 指定.lib文件路径:属性->配置属性->VC++目录->库目录
  • 附加依赖项加入lib名称:属性->配置属性->链接器->输入->附加依赖项中输入lib名称

动态库的引用
(1)使用.h、.lib、.dll的方式

  • 指定.h文件路径:属性->配置属性->VC++目录->包含目录
  • 指定.lib文件路径:属性->配置属性->VC++目录->库目录
  • 附加依赖项加入lib名称:属性->配置属性->链接器->输入->附加依赖项中输入lib名称
  • dll文件的引入:
    方式1: dll放在可执行文件运行目录下
    方式2: 指定PATH路径,属性->配置属性->调试->环境。 PATH=C:/…;%PATH%
    注意:这里的PATH名字不能更换。

(2)仅使用dll文件的方式

1.2.3 dll函数extern

dll cpp中:(定义必须在cpp文件中,不能在.h和.hpp中)

extern "C"{
	__declspec(dllexport) void func();
}

使用:

#pragma comment(lib, ".lib")

extern "C"{
	void* func();
}

1.3 VS删除某个库

注意:在资源库中直接删除会出现找不到删除库的问题,应先移除项目,再删除。

二、libcurl的编译

2.1 cmake-gui的安装

  • 下载链接: https://cmake.org/download/
  • 注意加入环境变量

2.2 zlib

  • 下载链接:http://www.zlib.net/
  • 打开cmake-gui
  • 配置好源文件路径和build路径
  • 建议生成静态库lib,有一个选项开关
  • 可以修改编译的库类型和安装路径prefix,configure和genrate
  • 打开sln文件
  • 生成ALL_BUILD和INSTALL

2.3 openssl

建议不自己编译,自己用nmake编译问题太多。

  • 百度云下载windows安装包,下载102s版本,高版本没有一些包:
    https://pan.baidu.com/s/1B_jI99kIFKVLS_NwX8Vvsw 提取码:0rob
  • 然后按照默认参数安装就好

2.4 libssh2

  • 下载链接:https://www.libssh2.org/snapshots/
  • 解压压缩包
  • 打开libssh2\win32\libssh2.dsw
    在这里插入图片描述
    在这里插入图片描述
    打开 libssh2 的属性管理器,可以看到该项目被官方配置好了已经有很多编译方式
    在这里插入图片描述
    建议编译lib release,编译为静态库,不需要配置dll的路径。
  • 修改为openssl lib release编译后,会在文件夹生成一个release_lib文件夹。
  • 注意将protoc.exe加入到环境变量path中

2.5 libcurl

  • 下载链接:https://curl.haxx.se/download/curl-7.61.1.zip
  • 解压
  • cmake-gui打开并配置源文件路径和build路径
  • 配置zlib静态库文件和头文件路径,勾选USE_OPENSSL和USE_SSH2, 修改安装路径prefix,add Entry:
ZLIB_INCLUDE_DIR D:.....
ZLIB_LIBRARIES D:......
OPENSSL_INCLUDE_DIR D:.....
OPENSSL_LIBRARIES D:......

configure, 如果zlib的路径或则libssh2的路径不正确,修改后,重新configure,然后再generate

  • 打开build目录下的sln文件
  • ALL_BUILD和INSTALL

三、protobuf的编译

  • 下载地址:https://github.com/protocolbuffers/protobuf/tree/3.6.x
  • 源目录选择cmakelis文件所在目录,选择protobuf-3.4.0文件夹中的cmake文件夹。
  • 注意win32还是x64版本
    在这里插入图片描述
  • 点击Configure,提示找不到gmock目录。
  • 取消protobuf_BUILD_TESTS,
  • 勾选protobuf_BUILD_SHARED_LIBS,
  • 勾选ZLIB,并指定ZLIB路径(重要)ZLIB_LIBRARY ZLIB_INCLUDE_DIR
  • 下载gmock源码,解压后,重命名为gmock,放在protobuf目录下即可。
  • 编译后,生成对应的链接库。
  • 编译Install项目,
  • 在系统的环境变量中,在系统变量PATH中添加路径:D:\protobuf-3.4.0\Builds\install\bin;然后重启系统!

四、opencv的编译

  • 下载地址:
  • 解压并用cmake-gui打开
    在这里插入图片描述
  • 第一次Configure:点击左下部分的Configure按钮
    在这里插入图片描述
  • 在弹出的对话框中选择VS的版本
    在这里插入图片描述
  • 第一次Configure 完成后。会很多红的,根据自己的情况修改相应的cmake变量,再次点击configure
    在这里插入图片描述
  • 单击Configure按钮右侧的 Generate按钮
    在这里插入图片描述
  • Generate完成结果
    在这里插入图片描述
  • 打开.sln
  • ALL_BUILD和INSTALL

选择官网下载exe安装更好

五、ncnn的编译

  • 下载ncnn: https://github.com/Tencent/ncnn
  • 打开CMake-GUI: 设置 源文件目录:D:/ncnn-master 设置 目标文件目录:D:/ncnn-master/Builds 点击 Configure
  • 点击add entry,根据自己的路径加入以下内容:
Protobuf_LIBRARIES=D:\protobuf-3.4.0\Builds\install\lib\libprotobuf.lib
Protobuf_INCLUDE_DIR=D:\protobuf-3.4.0\Builds\install\include
Protobuf_PROTOC_EXECUTABLE=D:\protobuf-3.4.0\Builds\install\install/bin/protoc.exe
CMAKE_CONFIGURATION_TYPES=Release
Protobuf_SRC_ROOT_FOLDER=D:/protobuf-3.4.0/src
OpenCV_DIR=.../lib (可以不要,OPenCV用于example,没有用)
OpenCV_INCLUDE_DIRS
  • 再次点击 Configure 点击 Generate
  • 打开 目标文件目录(D:/ncnn-master/Builds)中的工程文件(ncnn.sln),编译其中的INSTALL项目即可
  • 注意protobuf是win32

六、rdkafka的编译

七、Linux下的动态库和静态库

7.1 头文件和库文件的搜索顺序

7.1.1 头文件搜索顺序

  • 先搜索当前目录
  • 接着搜索-I指定的目录
  • 然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
  • 再找内定目录: /usr/include, /usr/local/include
  • 最后找gcc的一系列自带目录
CPLUS_INCLUDE_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include

7.1.2 库文件搜索顺序

  • gcc会去找-L指定的目录
  • 再找gcc的环境变量LIBRARY_PATH
  • 再找内定目录
/lib和/lib64
/usr/lib 和/usr/lib64
/usr/local/lib和/usr/local/lib64

八、Linux与windows跨平台

8.1 MinGW和Cygwin

8.1.1 什么是MinGW

MinGW,即 Minimalist GNU For Windows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生 Windows32 程序。

实际上 MinGW 并不是一个 C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。

开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。

8.1.2 MinGW安装

8.1.3 MinGW与Cygwin:原理与比较

首先 MinGW 和 Cygwin 都可以用来跨平台开发。

MinGW 是 Minimalistic GNU for Windows 的缩写,也就是 Win 版的 GCC。

Cygwin 则是全面模拟了Linux的接口,提供给运行在它上面的的程序使用,并提供了大量现成的软件,更像是一个平台。

相对的 MingW 也有一个叫 MSys(Minimal SYStem)的子项目,主要是提供了一个模拟 Linux 的 Shell 和一些基本的 Linux 工具。因为编译一个大型程序,光靠一个 GCC 是不够的,还需要有 Autoconf 等工具来配置项目,所以一般在 Windows 下编译 ffmpeg 等 Linux 下的大型项目都是通过Msys 来完成的,当然 Msys 只是一个辅助环境,根本的工作还是 MingW 来做的。

基本原理不同

  • 修改编译器,让 Window 下的编译器把诸如 fork 的调用翻译成等价的形式,这就是 MingW 的做法.
  • 修改库,让 Window 提供一个类似 UNIX 提供的库,他们对程序的接口如同 UNIX 一样,而这些库,当然是由 win32 的 API 实现的,这就是 Cygwin 的做法.
    用 MingW 和 Cygwin 编译出来的程序的区别

首先 MingW 和 Cygwin 都不能让 Linux 下的程序直接运行在 Windows 上,必需通过源代码重新编译。

现代操作系统包括 Windows 和 Linux 的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之所以二者上的程序不能兼容,主要是它们对这些功能具体实现上的差异,首先是可执行文件的格式,Window 使用 PE 的格式,并且要求以 .EXE 为后缀名。Linux 则使用 Elf。其次操作系统的 API 也不一样,如 Windows 用 CreateProcess() 创建进程,而 Linux 使用 fork()。

所以要移植程序必然要在这些地方进行改变,MingW 有专门的 W32api 头文件,来把代码中 Linux 方式的系统调用替换为对应的 Windows 方式。而 Cygwin 则通过 cygwin1.dll 这个文件来实现这种 API 的转换,并模拟一个 Linux 系统调用接口给程序,程序依然以 Linux 的方式调用系统 API,只不过这个 API 在 cygwin1.dll 上,cygwin1.dll 再调用 Windows 对应的实现,来把结果返回给程序。

可以用查看他们编译好的程序的导入表来验证这点。


二者生成的程序都是能在 Windows 上运行的 EXE 文件,显然都是 PE 格式,用一个PE格式查看工具检查一下就能发现,Cygwin 生成的程序依然有 fork() 这样的 Linux 系统调用,但目标库是 cygwin1。而 MingW 生成的程序,则全部使用从 KERNEL32 导出的标准 Windows 系统 API。

这样看来用 MingW 编译的程序性能会高一点,而且也不用带着那个接近两兆的 cygwin1.dll 文件。

但 Cygwin 对 Linux 的模拟比较完整,甚至有一个 Cygwin X 的项目,可以直接用 Cygwin 跑 X。

另外 Cygwin 可以设置 -mno-cygwin 的 flag,来使用 MingW 编译。

而与 Cygwin 更有可比性的 MSys 上的工具也是通过 Cygwin 这种模拟的方式来提供的。

总之这两个项目有千丝万缕的关系,一个不恰当的比方,如果 Mingw 是 MFC,Cygwin 就是 .NET 了。

8.1.4 Windows平台上使用MinGW编译Linux程序

1.下载安装mingw32
2.将mingw下bin和msys\1.0下bin设置为系统path
3.启动msys.bat
4.cd到项目目录
5.输入./configure
6.输入make
7.输入make install
8.cd C:\MinGW\msys\1.0\local\lib
9.ar x ***.a
10.ar r ***.lib *.o
即生成***.lib,头文件在C:\MinGW\msys\1.0\local\include

8.1.5 Windows上调用MinGW编译的函数库

静态库函数

静态库扩展名一般是.lib(windows上)或.a(linux上),他和动态库(dll)是有区别的。调用静态库编译后会写入执行程序中。然后就可以独立运行了。动态库旨在动态调用,调用的时候需要加载dll才能正常工作(所以动态库往往可以提供补丁,或功能升级的时候使用,但是运行的速度有待商协)。另外,两个库的编译器也不一样,例如mingw用g++生成动态库*.dll, 用ar生成静态库*.a;而VC则一律用link.exe生成生成动态和静态库,用options来区别生成哪种。

示例

  • 假设有两个代码块lib
//myf1.cpp
#include <stdio.h>
void f1_Fonction1(int a, double b, char *c)
{
    printf("调用文件myf1.cpp的f1_Fonction1成功\n");
}
int f1_Fonction2(int c)
{
    printf("调用文件myf1.cpp的f1_Fonction2成功\n");
    return c+1;
}
 
//myf2.c
#include <stdio.h>
void f2_Fonction1(void)
{
    printf("调用文件myf2.c的f2_Fonction1成功\n");
}
int f2_Fonction2(int c)
{
    printf("调用文件myf2.c的f2_Fonction2成功\n");
    return c+2;
}
  • 首先我们用gcc命令将他们编译成目标文件myf1.o和myf2.o
gcc -c myf1.cpp myf2.c
  • 接着使用ar命令生成静态库 mylib.lib
ar r mylib.lib myf1.o myf2.o
  • 编写调用的静态库的主函数
//main.cpp
#include <iostream>
using namespace std;
void f1_Fonction1(int a, double b, char *c);
int main()
{
    char c;
    f1_Fonction1(1,2.0,&c); //调用了myf1里面的函数f1_Fonction
    cout << "Hello world!" << endl;
    return 0;
}
  • 用MinGW编译,先生成main.o文件
gcc -c main.cpp
  • 接着把main.o和函数库mylib.lib连接起来生成main.exe文件
g++ -o main.exe main.o mylib.lib

8.2 GNU

8.2.1 什么是GNU

GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。

GNU是“GNU is Not Unix”的递归缩写。Stallman宣布GNU应当发音为Guh-NOO以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new相同)。UNIX是一种广泛使用的商业操作系统的名称。由于GNU将要实现UNIX系统的接口标准,因此GNU计划可以分别开发不同的操作系统部件。GNU计划采用了部分当时已经可自由使用的软件,例如TeX排版系统和X Window视窗系统等。不过GNU计划也开发了大批其他的自由软件。

8.2.2 gnu、gcc、g++的区别与联系

GNU:可以看作一个开源平台。里面有大量开源项目。

GCC:GNU中的编译器项目。集成了多种语言的编译器,包括有gcc、g++。

g++:GCC中的c++编译器。

gcc:GCC中的c编译器。

包含关系

GNU -> GCC -> g++
		   -> gcc
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐