什么是MSVC dll,静态库和导入库的正确命名约定

Art*_*yom 11 dll naming-conventions cmake static-libraries visual-c++

什么是MSVC库构建的标准或"最流行"命名约定.

例如,对于以下平台,库foo具有以下约定:

Linux的/ GCC:

shared: libfoo.so
import: ---
static: libfoo.a
Run Code Online (Sandbox Code Playgroud)

Cygwin的/ GCC:

shared: cygfoo.dll
import: libfoo.dll.a
static: libfoo.a
Run Code Online (Sandbox Code Playgroud)

在Windows/MinGW的:

shared: libfoo.dll
import: libfoo.dll.a
static: libfoo.a
Run Code Online (Sandbox Code Playgroud)

什么应该用于MSVC buidls?据我所知,通常名称是foo.dllfoo.lib,但你通常如何区分导入库和静态库?

注意:我问,因为它们之间CMake创建了令人不愉快的碰撞,将导入和静态库命名为foo.lib.查看错误报告.答案将帮助我说服开发人员解决这个问题.

Joh*_*ler 6

您可以通过扩展名区分库和.dll。但是您可以通过文件名而不是扩展来区分导入库和静态库。

绝不会存在为一组构建为静态库的代码而存在的导入库,或者为dll而存在静态库的情况。这是两件事。

没有单一的MSVC标准文件名约定。作为一个规则,一个库名,在“d”两端往往是库代码调试版本,msvcrtd.dllVS msvcrt.dll但除此之外,也没有一个标准。


Chr*_*uns 5

正如其他人所说,没有标准,但有流行的惯例.我不确定如何明确地判断什么是最受欢迎的惯例.除了你提到的静态与导入库的命名之外,Release库与Debug库的命名之间也有类似的区别,特别是在Windows上.

这两种情况(即静态与导入,调试与发布)都可以通过以下两种方式之一进行处理:不同的名称或不同的目录位置.我通常选择使用不同的名称,因为我觉得它最大限度地减少了以后误将库类型误解的可能性,特别是在安装或其他文件移动活动之后.

我通常使用foo.dllfoo.libWindows上的共享库,并foo_static.lib为静态库,当我希望有共享和静态版本.我见过其他人使用这个约定,所以它可能是"最受欢迎的".

所以我建议你在桌子上添加以下内容:

在Windows/MSVC:

shared: foo.dll
import: foo.lib
static: foo_static.lib
Run Code Online (Sandbox Code Playgroud)

然后在cmake,你也可以

add_library(foo_static STATIC foo.cpp)
Run Code Online (Sandbox Code Playgroud)

要么

add_library(FooStatic STATIC foo.cpp)
set_target_properties(FooStatic PROPERTIES OUTPUT_NAME "foo_static") 
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因您不希望使用"foo_static"作为符号库名称.