我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文的主旨是原生方式编译nanomsg/nng这个c语言项目,原生方式指的是官方推荐的cmake+ninja的方式。与此对应的是通过cmake gui转为其它编译器(例如visual studio)工程。另外,在win环境下,存在着静态库和动态库两种使用方式。这对于nanomsg/nng的使用,会造成很大的误解。所以,这里也会提及相关编译参数。

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - nanomsg原生编译
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10cmake@3.28.0ninja@1.11.1mingw@12.2.0.03042023

前文回顾

对于nanomsg/nng有个简要的文章回顾,

本文编译环境,利用到的编译工具(命令)下载:

获取nng源码

nanomsg/nng的官方网站是:

可以在这里下载到nng的源码:

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - nanomsg-nng-github
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-2)

[参数一]动态库和静态库参数

win环境下(其它系统下暂不考虑),链接库文件有两种形式:“动态”和“静态”。
两者有着非常大的区别,根据nng的官方讨论帖子,它的控制参数是:BUILD_SHARED_LIBS

文件参数
动态库nng.lib[文件小] + nng.dllBUILD_SHARED_LIBS='On'
静态库nng.lib[文件大]BUILD_SHARED_LIBS=''

对此,nanomsg/nng官方对此有很多个帖子进行讨论,很多人提及使用nng的时候,类似报错:

unresolved external symbol __imp__nng_setopt

被作者愤怒关帖子,因为这个问题实际上并不是nngbug,而是使用的问题[基础知识薄弱]。

[参数二]win32和x86控制

自建项目使用这个nng的时候,还会面临一个问题,就是win32x64的区别。表面上看起来无感,但是因为所有的导出函数在这两种情况下,是具有非常类似的命名的,很容易造成混淆和误解。也也是后续使用的时候,大量报错的主要原因。但是,这一点上官方并未提及。

主要的区别在于导出函数的命名前缀,下表以函数命名为sn为例:

链接库使用arch环境导出函数
动态dllwin32(x86)__imp__a()
动态dllx64__imp_a()
静态libx86/x64a()

仔细看区别,就能明白为啥会出现已经是dll,还存在unresolved external symbol的问题了。

认识Generators参数

nng进行编译的套路是:
【第一步】先建立一个build文件夹,然后进入到文件夹。【个人认为:不同的参数换不同的build文件夹】
【第二步】执行cmake命令,注意这里的..并不是省略的意思,是向上一层的意思。Generator转换项目结构。
【第三步】执行对应的Generatorbuild命令。

Generators
  Visual Studio 17 2022        = Generates Visual Studio 2022 project files.
                                 Use -A option to specify architecture.
  Visual Studio 16 2019        = Generates Visual Studio 2019 project files.
                                 Use -A option to specify architecture.
  Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 12 2013 [arch] = Deprecated.  Generates Visual Studio 2013
                                 project files.  Optional [arch] can be
                                 "Win64" or "ARM".
  Visual Studio 9 2008 [arch]  = Deprecated.  Generates Visual Studio 2008
                                 project files.  Optional [arch] can be
                                 "Win64" or "IA64".
  Borland Makefiles            = Generates Borland makefiles.
  NMake Makefiles              = Generates NMake makefiles.
  NMake Makefiles JOM          = Generates JOM makefiles.
  MSYS Makefiles               = Generates MSYS makefiles.
  MinGW Makefiles              = Generates a make file for use with
                                 mingw32-make.
  Green Hills MULTI            = Generates Green Hills MULTI files
                                 (experimental, work-in-progress).
  Unix Makefiles               = Generates standard UNIX makefiles.
  Ninja                        = Generates build.ninja files.
  Ninja Multi-Config           = Generates build-<Config>.ninja files.
  Watcom WMake                 = Generates Watcom WMake makefiles.
  CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files
                                 (deprecated).
  CodeBlocks - NMake Makefiles = Generates CodeBlocks project files
                                 (deprecated).
  CodeBlocks - NMake Makefiles JOM
                               = Generates CodeBlocks project files
                                 (deprecated).
  CodeBlocks - Ninja           = Generates CodeBlocks project files
                                 (deprecated).
  CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files
                                 (deprecated).
  CodeLite - MinGW Makefiles   = Generates CodeLite project files
                                 (deprecated).
  CodeLite - NMake Makefiles   = Generates CodeLite project files
                                 (deprecated).
  CodeLite - Ninja             = Generates CodeLite project files
                                 (deprecated).
  CodeLite - Unix Makefiles    = Generates CodeLite project files
                                 (deprecated).
  Eclipse CDT4 - NMake Makefiles
                               = Generates Eclipse CDT 4.0 project files
                                 (deprecated).
  Eclipse CDT4 - MinGW Makefiles
                               = Generates Eclipse CDT 4.0 project files
                                 (deprecated).
  Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files
                                 (deprecated).
  Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files
                                 (deprecated).
  Kate - MinGW Makefiles       = Generates Kate project files (deprecated).
  Kate - NMake Makefiles       = Generates Kate project files (deprecated).
  Kate - Ninja                 = Generates Kate project files (deprecated).
  Kate - Ninja Multi-Config    = Generates Kate project files (deprecated).
  Kate - Unix Makefiles        = Generates Kate project files (deprecated).
  Sublime Text 2 - MinGW Makefiles
                               = Generates Sublime Text 2 project files
                                 (deprecated).
  Sublime Text 2 - NMake Makefiles
                               = Generates Sublime Text 2 project files
                                 (deprecated).
  Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files
                                 (deprecated).
  Sublime Text 2 - Unix Makefiles
                               = Generates Sublime Text 2 project files
                                 (deprecated).

默认生成[libnng.a]

官方推荐的是使用ninja作为Generator,但是在win系统下,也可以成功执行。但是,貌似得到的输出是用于linuxlibnng.a文件【不符合本次输出的实际需求】。

mkdir build
cd build
cmake -G Ninja ..
ninja test
ninja install

最后一步ninja install需要管理员权限,才能安装。最终在C:/Program Files (x86)/nng/目录下,得到了目标输出。(很多.exe.h文件。但是库文件得到的是个*unix下的.a文件,貌似也不是目标输出。

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - nng-install
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-3)

Generator vs2019[nng.lib/nng.dll]

如果把官方的Generator改成vs2019的话,就可以得到nng.lib或者nng.dll输出了。
根据情况执行某条命令:(vs2022arch参数不一样,请参考上面generator那部分大段英文内容)

清理缓存

进行下一次构建之前,可能需要执行命令清理缓存。

cmake --refresh

根据实际需求,选择自己需要的命令。

【分支一】static_lib(x86)

mkdir build_x86_static
cd build_x86_static
cmake -G "Visual Studio 16 2019" -A Win32 ..
cmake --build . --config Release

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - 代码分支一命令
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-4)

【分支二】static_lib(x64)

mkdir build_x64_static
cd build_x64_static
cmake -G "Visual Studio 16 2019" -A x64 ..
cmake --build . --config Release

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - 代码分支二命令
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-5)

【分支三】shared_lib(x86)【本文推荐】

shared+w32虽然不一定符合读者的要求,但是符合苏南大叔的本次需求,所以【本文推荐】。

mkdir build_x86_shared
cd build_x86_shared
cmake -G "Visual Studio 16 2019" -A Win32 -D BUILD_SHARED_LIBS='On' ..
cmake --build . --config Release

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - 代码分支三命令
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-6)

【分支四】static_lib(x64)

mkdir build_x64_shared
cd build_x64_shared
cmake -G "Visual Studio 16 2019" -A x64 -D BUILD_SHARED_LIBS='On' ..
cmake --build . --config Release

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - 代码分支四命令
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-7)

Generator vs2019 再次解释

如果使用cmake gui的话,也是可以做到一样的效果的。如下图所示:

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - cmake-gui
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-8)

然后打开visual studio 2019,也是可以右键生成项目的。一样的效果。

苏南大叔:nanomsg原生编译,利用cmake和ninja编译成动静两种形态 - vsbuild
nanomsg原生编译,利用cmake和ninja编译成动静两种形态(图9-9)

结语

苏南大叔的cpp相关经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   cpp