相关疑难解决方法(0)

何时使用动态库和静态库

在C++中创建类库时,可以在动态(.dll,.so)和静态(.lib,.a)库之间进行选择.它们之间有什么区别,何时适合使用哪种?

c++ dll shared-libraries dynamic-linking static-linking

426
推荐指数
11
解决办法
23万
查看次数

如何规避Windows Universal CRT标头对vcruntime.h的依赖性

在尝试评估Windows上的Clang时,利用Windows通用C运行时(...\Windows Kits\10\Include\10.0.15063.0\ucrt),我立即面临意外的墙,形式是未公开和意外的依赖在微软的Visual Studio上.显然,即使是最简单的C程序也只有在包含任何标准C头时才能编译,因为它们似乎最终都试图#include vcruntime.h(它不是UCRT的一部分).

我的问题是:

  1. 有没有办法在没有Visual Studio的情况下使用Windows Universal C RTL SDK?
  2. 如果它没有意图或可能,为什么它不被称为"Windows CRT for Microsoft VC" - 我错过了什么?

c windows sdk clang-cl universal-crt

7
推荐指数
1
解决办法
992
查看次数

将 google protobuf lib 静态链接到 dll 库

在安装和使用 google protobuf 库(在 Windows 上安装 Protobuf)的说明页面上,它指出:

如果您的项目本身是供第三方软件使用的 DLL,我们建议您不要在库的公共接口中公开协议缓冲区对象,并且将协议缓冲区静态链接到您的库中

我想知道如何做到这一点。据我所知,您可以通过两种方式构建 google protobuf:静态和动态。

如果您动态构建它,您将面临上述问题。如果您静态构建它,那么您将使用多线程 (/MT) 的Visual Studio 中的代码生成类型。这意味着在我的 dll 库(它是用多线程 DLL (/MD)构建的)中,您将收到以下链接器错误:

错误 LNK2038:检测到“RuntimeLibrary”不匹配:值“MTd_StaticDebug”与 Emulator.obj 中的值“MDd_DynamicDebug”不匹配

现在有几个问题涉及如何解决这个问题:

但答案通常是,更改您的库以匹配其他库的构建类型。问题是,我不想那样做,我想要一个 DLL。我想静态链接 google protobuf,如他们的文档中所述。我怎样才能做到这一点?

c++ dll linker linker-errors protocol-buffers

6
推荐指数
1
解决办法
8890
查看次数

Visual Studio 中(基于字符的)STL(流)容器的编译错误

这基本上与[SO]: C2491: 'std::numpunct<_Elem>::id' : Define of dllimport static data member not allowed [close] 相同,但考虑以下事实:

  • (在我看来)这是一个完全有效的问题(根据[SO]:如何创建一个最小的、完整的和可验证的示例),我真的不知道为什么有些用户有关闭它的冲动
  • 标记为解决方案的答案提供了修复错误的指南(一般而言),但不适用于当前情况,并且当然不会修复它

请不要将其关闭或将其标记为重复项(至少,在没有仔细阅读和理解的情况下)。

主要.cpp

#include <sstream>


//#define THROW_C2491
#if defined(THROW_C2491)
typedef int CharType;
#else
typedef char CharType;
#endif


int main() {
    std::basic_stringstream<CharType> stream;
    CharType c = 0x41;
    stream << c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码稍作修改(简化),如果 THROW_C2491定义则无法编译:

xlocnum(294): error C2491: 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed
Run Code Online (Sandbox Code Playgroud)

输出

xlocnum(294): error C2491: 'std::numpunct<_Elem>::id': definition of …
Run Code Online (Sandbox Code Playgroud)

c++ windows dllimport visual-studio visual-c++

5
推荐指数
1
解决办法
5566
查看次数

从 C++ 项目 (Visual Studio) 使用参数调用 Python 函数

我需要在 Windows 平台下从我的 C++ 项目中调用实现为 Python (3.6) 函数的管道。来自文件“ experiment_test.py ”的函数“ function_name ”将文本字符串作为输入参数,并返回另一个文本字符串作为结果。我尝试了下面的代码,但它不能正常工作 - 库shutilcodecsmakedirs等中的python 函数不起作用。

C++ 代码(减少):

std::string Text,Result;
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
Py_Initialize();

pName = PyUnicode_FromString("experiment_test");
pModule = PyImport_Import(pName);    
pDict = PyModule_GetDict(pModule);

pFunc = PyDict_GetItemString(pDict, "function_name");

pArgs = PyTuple_New(1);
pValue = PyUnicode_FromString(Text.c_str());
PyTuple_SetItem(pArgs, 0, pValue);

if (PyCallable_Check(pFunc))
{
    pValue = PyObject_CallObject(pFunc, pArgs);
    if (pValue != NULL)
    {
        Result = PyUnicode_AsUTF8(pValue);    
        Py_DECREF(pValue);
    }
    else return false;    
}
// ...

Py_Finalize();
Run Code Online (Sandbox Code Playgroud)

Python代码(减少): …

c++ python

4
推荐指数
1
解决办法
3590
查看次数

如何在Visual Studio Expres 2012 Windows 7 x64中包含openssl

我正在努力将openssl添加到我的项目中.我已经下载了Windows的预编译安装程序,并且我安装了库,但是我找不到在我的项目中包含openssl的方法.

c++ openssl visual-studio visual-studio-2012

3
推荐指数
2
解决办法
3万
查看次数