Visual Studio 静态库被识别为动态库,检测到'RuntimeLibrary' LNK2038不匹配,

cqoc49vn  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(179)

我尝试将第三方库静态链接到我自己的.exe,这样我只需要分发一个.exe文件。首先,我从源代码构建了所有第三方静态库,生成了几个.lib文件。
然后在visual studio中,在我自己的项目中,我设置了Project->properties->C/C++->Code generation->Runtime Library to Multi-threaded (/MT)
LNK2038 mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in ConsoleApplication1.obj
后面的部分MT_StaticRelease确实有意义,因为我正在尝试静态链接,而前面的部分MD_DynamicRelease是绝对错误的,因为我提供了静态库。我将Project->properties->Linker->General->Additional Library Dependencies设置为一个只包含*.lib的文件夹。我非常肯定这些 *.lib是静态库而不是导入库。
当我更改为Project->properties->C/C++->Code generation->Runtime Library to Multi-threaded DLL (/MD)时,构建成功。
visual studio将 *.lib识别为动态库,这真的很奇怪。
1.我已经检查了%PATH%以排除任何其他可能的污染。你有什么想法吗?
1.我已经删除了所有该高速缓存从以前的建设。

#include "gdcmReader.h"

#ifdef _WIN32
#pragma comment(lib, "gdcmDSED")
#pragma comment(lib,"WS2_32")
#endif

typedef std::set<gdcm::DataElement> DataElementSet;
typedef DataElementSet::const_iterator ConstIterator;

int main(int argc, char *argv[])
{
    if (argc < 2) {
        std::cout << "Usage: xxxx.exe dicom_filename" << std::endl;
        return 1;
    }

    const char *filename = argv[1];

    gdcm::Reader reader;
    reader.SetFileName(filename);
    if (!reader.Read())
    {
        std::cerr << "Could not read: " << filename << std::endl;
        return 1;
    }
    std::stringstream strm;

    gdcm::File &file = reader.GetFile();
    gdcm::DataSet &ds = file.GetDataSet();
    gdcm::FileMetaInformation &fmi = file.GetHeader();

    if (ds.FindDataElement(gdcm::Tag(0x10, 0x10))) {
        const gdcm::DataElement &de = ds.GetDataElement(gdcm::Tag(0x10, 0x10));
        std::cout << de << std::endl;
    }
    return 0;
}
mlnl4t2r

mlnl4t2r1#

感谢这条评论,我已经解决了这个问题。问题是第三方库没有正确构建。
在构建第三方库时,虽然我设置了Project->Properties->General->Project Defaults->Configuration Type Static library (.lib),但也就是说我构建的是静态库。
但是,我使用的是Project->properties->C/C++->Code generation->Runtime Library to Multi-threaded DLL(/MD),当把它改成Multi-threaded (/MT)时,一切都很好。

相关问题