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缺失的问题。因此,选择合适的设置取决于您的程序和部署需求。