windows下编译中的链接错误记录

Windows下修改,编译大一点的项目时 error LNK2001,LNK2019

一般是没有将对应的定义的加入进去。

如果确认链接的库有定义,则可能是没有将函数名导出:

cmake:
#变量来控制是否导出所有符号
#set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

add_library(mylib SHARED mylib.cpp)
target_sources(mylib PRIVATE mylib.def)
在CMake中指定使用MT(多线程静态库)作为运行库,可以通过设置`CMAKE_MSVC_RUNTIME_LIBRARY`变量来实现。具体操作如下:

1. **全局设置**:
   如果您希望对整个项目中所有的目标都使用MT运行库,可以在`CMakeLists.txt`文件中进行全局设置。在`cmake_minimum_required`和`project`命令之后,添加以下代码:

   ###cmake
   set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
   ###

   这将为整个解决方案配置MSVC运行库,使其在Debug配置下使用`MultiThreadedDebug`(MTd),而在非Debug配置下使用`MultiThreaded`(MT)。

2. **针对特定目标设置**:
   如果您只需要对特定的目标设置MT运行库,可以使用`target_compile_options`命令。例如,如果您的目标名为`mytarget`,则可以这样设置:

   ###cmake
   target_compile_options(mytarget PRIVATE
     $<$<CONFIG:Debug>:/MTd>
     $<$<CONFIG:Release>:/MT>)
   ###

   这将只为`mytarget`目标在Debug配置下设置`/MTd`标志,在Release配置下设置`/MT`标志。

3. **通过CXX FLAGS设置**:
   您还可以通过`CMAKE_CXX_FLAGS`来全局设置编译选项,将默认的`/MD`替换为`/MT`。在`CMakeLists.txt`中添加如下代码:

   ###cmake
   if(MSVC)
     foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE)
       string(REPLACE /MD ${var} "/MT")
     endforeach()
   endif()
   ###

   这段代码会将所有默认的C、CXX编译选项中的`/MD`替换成`/MT`。

请注意,这些设置会影响链接到C运行时库的方式,使用MT意味着程序将静态链接到C运行时库,这可能会导致生成的文件体积增大,但可以减少对系统DLL的依赖。而MD则表示动态链接到C运行时库,这可能会导致在不同系统上运行时出现DLL缺失的问题。因此,选择合适的设置取决于您的程序和部署需求。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值