标签: msvcrt

MinGW / MinGW64 链接和对“msvcrt.dll”的依赖

我正在 MinGW 中为 WinAPI 编码

我还没有完全理解的一件事是 VC 可再发行版,我对它有一大堆问题

有人说,此类计划需要msvcrt.dll

  1. bot c++ 和 c 编译需要相同的库吗?
  2. 这适用于所有目标客户吗?
  3. 我必须重新分发它吗?我可以重新分发它吗?
  4. 我可以轻松摆脱这种外部依赖吗?
  5. 是否有其他编译器允许我不携带这种令人不快的外部依赖项?(我依稀记得听说它有问题 - 我听说它可能不是核心系统库,或者它不能免费使用和重新分发该库)

我发现这里有问题,因为我想生成不依赖的小exe,只调用系统WinAPI,如果我使用一些类似C标准库函数的函数,我更喜欢它经济地和静态地编译,而不是任何第三方依赖项

windows linker mingw msvcrt mingw-w64

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

无法使用 lld-link.exe (Windows) 链接 C 运行时库 (libcmt.lib)

我正在使用 LLVM 编写语言。我想避免打包 clang 并简单地使用 LLVM 工具(例如 lld、lld-link)。我一直在尝试printf从我的简单 IR 代码 ( testinput.ll) 中调用该函数:

; ModuleID = 'Test2'
source_filename = "entry"

@str_0 = private unnamed_addr constant [13 x i8] c"Hello world!\00"

declare i32 @printf(i8*, ...)

define i32 @main() {
entry:
  %anonymous_10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @str_0, i32 0, i32 0))
  ret i32 1234
}
Run Code Online (Sandbox Code Playgroud)

但无论我尝试什么,我都会收到错误消息:

$ clang-cl -fuse-ld=lld-link testinput.ll "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\spectre\x64\libcmt.lib"
Run Code Online (Sandbox Code Playgroud)

注意:我通过简单地在libcmt.lib系统上搜索来随机选择链接“... spectre\x64\libcmt.lib …

crt msvcrt llvm clang lld

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

strtok_s 和编译器 C11 向前兼容

C11 中的声明strtok_s及其用法看起来与 Visual Studio 2022 (17.4.4) 和 GCC 12.2.0 捆绑的最新编译器(查看 MinGW64 发行版)中的in 编译器非常不同。strtok_s

我担心这种不同的形式早在 C11 之前就已被开发为更安全且被接受的替代品strtok。如果有人想要使用strtok_s并保持 C11 合规,现在会发生什么?

编译器提供的库是否兼容 C11?

也许只是我被一些显而易见的事情愚弄了,有人可以帮助我......


这是 C11(与 C17 和 C23 的早期草案类似):

char *strtok_s(char * restrict s1,
    rsize_t * restrict s1max,
    const char * restrict s2,
    char ** restrict ptr);
Run Code Online (Sandbox Code Playgroud)

同样可以在safec 库中找到一个很好的参考

MSC/VC和 GCC 的形式为

char* strtok_s(
    char* str,
    const char* delimiters,
    char** context
);
Run Code Online (Sandbox Code Playgroud)

c gcc msvcrt visual-studio mingw-w64

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

解决多个CRT问题

我知道有一些类似的问题,但我不认为他们真的有与我相同的要求.

我们的DLL是使用Visual Studio 2005编译的,由于安装限制,必须与特定版本的CRT链接.这是绝对的,用最新版本重新编译它不是一个解决方案.

我们最近更新了Boost库.但是,当我构建Boost时,它会自动使用最新的CRT.现在,当我将Boost与我们的程序联系起来时,它会对CRT的最新(错误)版本和CRT的旧(正确)版本产生依赖关系.需要依赖最新版本.

这个问题的最佳解决方案是什么?目前,我能想到的最好的是使用旧版本重建Boost,但我不知道如何在不修改源代码的情况下轻松完成.

如果有办法强制Visual Studio全局使用特定版本的CRT(而不是基于每个项目),那将是很好的.或者只是简单地删除最新版本的CRT,但我很确定这是不可能的,因为我认为它被认为是操作系统的一部分.

c dependencies boost msvcrt visual-studio

3
推荐指数
1
解决办法
2099
查看次数

在.Net 4中:PInvokeStackImbalance例外

我正在使用.Net 3.5项目中的strlen函数msvcrt.dll.进一步来说:

private unsafe static extern int strlen( byte *pByte );

迁移到.NET 4.0后,如果我使用此函数,则会抛出PInvokeStackImbalance异常.

如何导入.NET 3.5 msvcrt.dll或修复此异常?

.net c# msvcrt .net-4.0

3
推荐指数
1
解决办法
2151
查看次数

MSVCRT:sin,cos等人的工具(源代码)在哪里?

我想知道在Visual C++ CRT中可以找到基本三角函数的实现.

在文件中查找"罪"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt节目的定义math.h,但仅此而已(除了一提EXPORTS的一些DEF文件的部分).

据我所知,sin这不是编译器将其自身转换为机器代码的关键字.所以必须有一个实现,即使该实现归结为一些直接的汇编代码.

我在这里错过了什么?哪个'代码?

编辑:显然,我不够清楚:我正在寻找源代码,而不是编译lib或DLL

c msvcrt visual-studio visual-c++

3
推荐指数
1
解决办法
2296
查看次数

右箭头符号导致突然结束?

我正在尝试写一个bittorrent客户端.为了解析文件等,我需要将torrent文件读入内存.我注意到fread没有将整个文件读入我的缓冲区.经过进一步调查后,似乎只要在文件中遇到如下所示的符号,fread就会停止读取文件.在FILE*指针上调用feof函数会返回16,表示已到达文件末尾.无论符号放在何处,都会发生这种情况.有人可以解释为什么会发生这种情况以及任何可行的解决方案.

符号突出显示如下:

在此输入图像描述

以下是执行读取操作的代码:

char *read_file(const char *file, long long *len){
struct stat st;
char *ret = NULL;
FILE *fp;

//store the size/length of the file
if(stat(file, &st)){
    return ret;
}
*len = st.st_size;

//open a stream to the specified file
fp = fopen(file, "r");
if(!fp){
    return ret;
}

//allocate space in the buffer for the file
ret = (char*)malloc(*len);
if(!ret){
    return NULL;
}

//Break down the call to fread into smaller chunks
//to account for a known bug which causes …
Run Code Online (Sandbox Code Playgroud)

c msvcrt

3
推荐指数
1
解决办法
922
查看次数

如何在控制台窗口失去焦点时检测按键

我的应用程序使用鼠标单击鼠标点击控制台窗口外的屏幕区域win32api.mouse_event.这会导致我的窗口失去焦点,因此无法检测按键msvcrt.kbhit.

我的问题是,如何在控制台窗口不可见/活动的情况下实现这样的功能?

编辑:

这是示例代码.这只是一个基本的控制台版本.如果控制台消失,请将其设置为保持在顶部.一旦它在控制台外部(100,100)发出咔嗒声,按Esc键不会突破循环.如何为这样的问题实现休息?

import msvcrt, win32api, win32con

pixelx = 100
pixely = 100

win32api.SetCursorPos((pixelx,pixely))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,pixelx,pixely,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,pixelx,pixely,0,0)

while 1:
    print 'Testing..'
    # body of the loop ...
    if msvcrt.kbhit():
        if ord(msvcrt.getch()) == 27:
            break
Run Code Online (Sandbox Code Playgroud)

python winapi msvcrt

3
推荐指数
1
解决办法
3558
查看次数

_control87()是否也设置了SSE MXCSR控制寄存器?

_control87笔记文档:

_control87 [...]影响[s] x87和SSE2的控制字(如果存在).

似乎SSE和SSE2 MXCSR控制寄存器是相同的,但是,文档中没有提到SSE单元.是否_control87影响SSE单元的MXCSR控制寄存器或仅适用于SSE2?

sse crt msvcrt fpu visual-c++

3
推荐指数
1
解决办法
571
查看次数

为什么有多个C函数用于不区分大小写的比较

为了比较任何字符串而不考虑它们的情况,有各种C库函数,如strcasecmp(),stricmp()stricmpi().这些有什么区别?

c string posix crt msvcrt

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

标签 统计

msvcrt ×10

c ×5

crt ×3

visual-studio ×3

mingw-w64 ×2

visual-c++ ×2

.net ×1

.net-4.0 ×1

boost ×1

c# ×1

clang ×1

dependencies ×1

fpu ×1

gcc ×1

linker ×1

lld ×1

llvm ×1

mingw ×1

posix ×1

python ×1

sse ×1

string ×1

winapi ×1

windows ×1