nanomsg原生编译,利用cmake和ninja编译成动静两种形态
发布于 作者:苏南大叔 来源:程序如此灵动~本文的主旨是原生方式编译nanomsg/nng
这个c
语言项目,原生方式指的是官方推荐的cmake
+ninja
的方式。与此对应的是通过cmake gui
转为其它编译器(例如visual studio
)工程。另外,在win
环境下,存在着静态库和动态库两种使用方式。这对于nanomsg/nng
的使用,会造成很大的误解。所以,这里也会提及相关编译参数。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10
,cmake@3.28.0
,ninja@1.11.1
,mingw@12.2.0.03042023
。
前文回顾
对于nanomsg/nng
有个简要的文章回顾,
本文编译环境,利用到的编译工具(命令)下载:
- https://newsn.net/say/cmake.html [cmake]
- https://newsn.net/say/ninja.html [ninja]
- https://newsn.net/say/choco-mingw.html [gcc,c++,mkdir,rm,rmdir]
获取nng源码
nanomsg/nng
的官方网站是:
可以在这里下载到nng
的源码:
[参数一]动态库和静态库参数
在win
环境下(其它系统下暂不考虑),链接库文件有两种形式:“动态”和“静态”。
两者有着非常大的区别,根据nng
的官方讨论帖子,它的控制参数是:BUILD_SHARED_LIBS
。
库 | 文件 | 参数 |
---|---|---|
动态库 | nng.lib[文件小] + nng.dll | BUILD_SHARED_LIBS='On' |
静态库 | nng.lib[文件大] | BUILD_SHARED_LIBS='' |
对此,nanomsg/nng
官方对此有很多个帖子进行讨论,很多人提及使用nng
的时候,类似报错:
unresolved external symbol __imp__nng_setopt
被作者愤怒关帖子,因为这个问题实际上并不是nng
的bug
,而是使用的问题[基础知识薄弱]。
[参数二]win32和x86控制
自建项目使用这个nng
的时候,还会面临一个问题,就是win32
和x64
的区别。表面上看起来无感,但是因为所有的导出函数在这两种情况下,是具有非常类似的命名的,很容易造成混淆和误解。也也是后续使用的时候,大量报错的主要原因。但是,这一点上官方并未提及。
主要的区别在于导出函数的命名前缀,下表以函数命名a
为例:
链接库使用 | arch环境 | 导出函数 |
---|---|---|
动态dll | win32(x86) | __imp__a() |
动态dll | x64 | __imp_a() |
静态lib | x86/x64 | a() |
仔细看区别,就能明白为啥会出现已经是dll
,还存在unresolved external symbol
的问题了。
认识Generators参数
对nng
进行编译的套路是:
【第一步】建立build
文件夹,然后进入到文件夹。【个人认为:不同的参数换不同的build
文件夹】
【第二步】执行cmake
,注意这里的..
并不是省略的意思,是向上一层的意思。Generator
转换项目结构。
【第三步】执行对应的Generator
的build
命令。
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
系统下,也可以成功执行。但是,貌似得到的输出是用于linux
下libnng.a
文件【不符合本次输出的实际需求】。
mkdir build
cd build
cmake -G Ninja ..
ninja test
ninja install
最后一步ninja install
需要管理员权限,才能安装。最终在C:/Program Files (x86)/nng/
目录下,得到了目标输出。(很多.exe
和.h
文件。但是库文件得到的是个*unix
下的.a
文件,貌似也不是目标输出。
Generator vs2019[nng.lib/nng.dll]
如果把官方的Generator
改成vs2019
的话,就可以得到nng.lib
或者nng.dll
输出了。
根据情况执行某条命令:(vs2022
的arch
参数不一样,请参考上面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
【分支二】static_lib(x64)
mkdir build_x64_static
cd build_x64_static
cmake -G "Visual Studio 16 2019" -A x64 ..
cmake --build . --config Release
【分支三】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
【分支四】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
Generator vs2019 再次解释
如果使用cmake gui
的话,也是可以做到一样的效果的。如下图所示:
然后打开visual studio 2019
,也是可以右键生成项目的。一样的效果。
结语
苏南大叔的cpp
相关经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。