在输出文件中通过 gcc 编译 .dll 时如何编译 .lib 文件?如果我通过 clang 编译,那么它会给我 .dll 和 .lib
构建.bat:
REM Build script for engine
@ECHO OFF
SetLocal EnableDelayedExpansion
REM Get a list of all the .c files.
SET cFilenames=
FOR /R %%f in (*.cpp) do (
SET cFilenames=!cFilenames! %%f
)
REM echo "Files:" %cFilenames%
SET assembly=engine
SET compilerFlags=-g -Wvarargs -Wall -Werror
REM -Wall -Werror
SET includeFlags=-Isrc
SET linkerFlags=-luser32
SET defines=-D_DEBUG -D_CRT_SECURE_NO_WARNINGS
ECHO "Building %assembly%%..."
g++ %cFilenames% %compilerFlags% -o ../bin/%assembly%.dll %defines% %includeFlags% %linkerFlags%
GCC 使用静态库的扩展
.a
,而不是.lib
.Clang 给你的东西根本不重要。它可以在 GCC 或 MSVC 兼容模式下运行,具体取决于您的设置方式。
要构建静态库,请执行以下操作:
g++ 1.cpp -c
- 得到1.o
ar -rcs lib1.a 1.o
- 获取lib1.a
- 图书馆本身。在此之前,可能值得删除旧文件,否则它
ar
会将目标文件添加到现有文件中。(添加新的并覆盖旧的,但不会删除任何东西 - 有点。)强烈建议在文件名中添加前缀
lib...
,因为稍后,当您包含带有标志的库时-l??
,此前缀将自动添加到名称中...要构建动态库,请执行以下操作:
g++ 1.cpp -c
- 得到1.o
g++ 1.o -shared -o lib1.dll
- 得到lib1.dll
。现代 MinGW 可以直接与
.dll
. 如果您有一些旧版本,那么您需要添加到最后一个命令-Wl,--out-implib=lib1.dll.a
,以便以后在与库链接时,指定这个新创建lib1.dll.a
的,而不是.dll
(也带有标志-l1
,lib??.dll.a
自动附加)。尽管如此,紧身衬衫仍然是一个值得怀疑的选择。最好花时间学习 Make 或 CMake,然后它会(相对)跨平台。
它在垃圾桶里:
-D_DEBUG -D_CRT_SECURE_NO_WARNINGS
. 这仅对 MSVC 标准库有意义,GCC 有自己的。