生成和链接静态库
- 生成静态库
- 使用MinGW生成的静态库是以
.a
为后缀,以lib
为前缀,例如libtestlib.a
- 使用MSVC生成的静态库是以
.lib
为后缀,没有前缀,例如testlib.lib
- 使用MinGW生成的静态库是以
cmake_minimum_required(VERSION 3.28)
project(test)
set(CMAKE_CXX_STANDARD 17)
add_library(staticLib STATIC library.cpp library.h)
虽然生成的静态库不一样,但是两者在链接静态库的时候都是一样的,只不过如果是使用MinGW生成的静态库时,需要去头去尾,只保留库的名字部分,例如静态库为
libtestlib.lib
,我们链接的时写的是target_link_libraries(uselib testlib)
,把前缀和后缀去,然后掉取中间即可,只需要记住和链接MSVC静态库一样即可
- 链接静态库(lib)
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 14)
# 添加包含目录(lib目录里面包含了头文件)
include_directories(${PROJECT_SOURCE_DIR}/lib)
# 添加库目录(必做)
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 添加源文件
add_executable(MyProject main.cpp)
# 链接静态库(必做) 记住使用MinGW生成的静态库时要去头去尾
target_link_libraries(MyProject staticLib)
注意点:
-
确保静态库和应用程序使用相同的编译器
- 如果静态库是用 MSVC 编译的,那么应用程序也应该用 MSVC 编译。
- 如果静态库是用 MinGW 编译的,那么应用程序也应该用 MinGW 编译。
-
命名约定:
- 对于 MinGW 生成的库文件:
libtestlib.a
,链接时使用testlib
。 - 对于 MSVC 生成的库文件:
testlib.lib
,链接时使用testlib
。
- 对于 MinGW 生成的库文件:
-
错误排查:
- 如果链接失败,检查链接器命令中是否正确引用了库文件。
- 确保
link_directories
中的路径正确,并且库文件存在于该路径中。
报错原因:静态库和应用程序使用不同的编译器
,例如,静态库是使用MSVC生成的,但项目是使用MinGW,就会报如下错误
[1/2] Building CXX object CMakeFiles/uselib.dir/main.cpp.obj
[2/2] Linking CXX executable uselib.exe
FAILED: uselib.exe
C:\Windows\system32\cmd.exe /C “cd . && D:\CLion\bin\mingw\bin\g++.exe -g CMakeFiles/uselib.dir/main.cpp.obj -o uselib.exe -Wl,–out-implib,libuselib.dll.a -Wl,–major-image-version,0,–minor-image-version,0 -LD:/a-mycode/c++/clion/uselib/lib -luntitled -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd .”
D:\CLion\bin\mingw\bin/ld.exe: CMakeFiles/uselib.dir/main.cpp.obj: in functionmain': D:/a-mycode/c++/clion/uselib/main.cpp:5: undefined reference to
hello()’
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
报错原因:使用MinGW生成的静态库时没有去头去尾,例如使用target_link_libraries(uselib libtestlib)
,没有将前缀lib
去掉
FAILED: uselib.exe
C:\Windows\system32\cmd.exe /C “cd . && D:\CLion\bin\mingw\bin\g++.exe -g CMakeFiles/uselib.dir/main.cpp.obj -o uselib.exe -Wl,–out-implib,libuselib.dll.a -Wl,–major-image-version,0,–minor-image-version,0 -LD:/a-mycode/c++/clion/uselib/lib -llibtestlib -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd .”
D:\CLion\bin\mingw\bin/ld.exe: cannot find -llibtestlib: No such file or directory
D:\CLion\bin\mingw\bin/ld.exe: note to link with D:/a-mycode/c++/clion/uselib/lib\libtestlib.a use -l:libtestlib.a or rename it to liblibtestlib.a
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.