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.dll和foo.lib,但你通常如何区分导入库和静态库?
注意:我问,因为它们之间CMake创建了令人不愉快的碰撞,将导入和静态库命名为foo.lib.查看错误报告.答案将帮助我说服开发人员解决这个问题.
您可以通过扩展名区分库和.dll。但是您可以通过文件名而不是扩展名来区分导入库和静态库。
绝不会存在为一组构建为静态库的代码而存在的导入库,或者为dll而存在静态库的情况。这是两件事。
没有单一的MSVC标准文件名约定。作为一个规则,一个库名,在“d”两端往往是库代码调试版本,msvcrtd.dllVS msvcrt.dll但除此之外,也没有一个标准。
正如其他人所说,没有标准,但有流行的惯例.我不确定如何明确地判断什么是最受欢迎的惯例.除了你提到的静态与导入库的命名之外,Release库与Debug库的命名之间也有类似的区别,特别是在Windows上.
这两种情况(即静态与导入,调试与发布)都可以通过以下两种方式之一进行处理:不同的名称或不同的目录位置.我通常选择使用不同的名称,因为我觉得它最大限度地减少了以后误将库类型误解的可能性,特别是在安装或其他文件移动活动之后.
我通常使用foo.dll与foo.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"作为符号库名称.