生成和链接静态库

生成和链接静态库

  • 生成静态库
    • 使用MinGW生成的静态库是以.a为后缀,以lib为前缀,例如 libtestlib.a
    • 使用MSVC生成的静态库是以.lib为后缀,没有前缀,例如testlib.lib
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)

注意点:

  1. 确保静态库和应用程序使用相同的编译器

    • 如果静态库是用 MSVC 编译的,那么应用程序也应该用 MSVC 编译。
    • 如果静态库是用 MinGW 编译的,那么应用程序也应该用 MinGW 编译。
  2. 命名约定

    • 对于 MinGW 生成的库文件:libtestlib.a,链接时使用 testlib
    • 对于 MSVC 生成的库文件:testlib.lib,链接时使用 testlib
  3. 错误排查

    • 如果链接失败,检查链接器命令中是否正确引用了库文件。
    • 确保 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 function main': 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.

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值