我正在 MinGW 中为 WinAPI 编码
我还没有完全理解的一件事是 VC 可再发行版,我对它有一大堆问题
有人说,此类计划需要msvcrt.dll
我发现这里有问题,因为我想生成不依赖的小exe,只调用系统WinAPI,如果我使用一些类似C标准库函数的函数,我更喜欢它经济地和静态地编译,而不是任何第三方依赖项
我正在使用 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 …
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) 我知道有一些类似的问题,但我不认为他们真的有与我相同的要求.
我们的DLL是使用Visual Studio 2005编译的,由于安装限制,必须与特定版本的CRT链接.这是绝对的,用最新版本重新编译它不是一个解决方案.
我们最近更新了Boost库.但是,当我构建Boost时,它会自动使用最新的CRT.现在,当我将Boost与我们的程序联系起来时,它会对CRT的最新(错误)版本和CRT的旧(正确)版本产生依赖关系.需要依赖最新版本.
这个问题的最佳解决方案是什么?目前,我能想到的最好的是使用旧版本重建Boost,但我不知道如何在不修改源代码的情况下轻松完成.
如果有办法强制Visual Studio全局使用特定版本的CRT(而不是基于每个项目),那将是很好的.或者只是简单地删除最新版本的CRT,但我很确定这是不可能的,因为我认为它被认为是操作系统的一部分.
我正在使用.Net 3.5项目中的strlen
函数msvcrt.dll
.进一步来说:
private unsafe static extern int strlen( byte *pByte );
迁移到.NET 4.0后,如果我使用此函数,则会抛出PInvokeStackImbalance
异常.
如何导入.NET 3.5 msvcrt.dll
或修复此异常?
我想知道在Visual C++ CRT中可以找到基本三角函数的实现.
在文件中查找的"罪"在C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt
节目的定义math.h
,但仅此而已(除了一提EXPORTS
的一些DEF文件的部分).
据我所知,sin
这不是编译器将其自身转换为机器代码的关键字.所以必须有一个实现,即使该实现归结为一些直接的汇编代码.
我在这里错过了什么?哪个'代码?
编辑:显然,我不够清楚:我正在寻找源代码,而不是编译lib或DLL
我正在尝试写一个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) 我的应用程序使用鼠标单击鼠标点击控制台窗口外的屏幕区域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) _control87
笔记文档:
_control87
[...]影响[s] x87和SSE2的控制字(如果存在).
似乎SSE和SSE2 MXCSR控制寄存器是相同的,但是,文档中没有提到SSE单元.是否_control87
影响SSE单元的MXCSR控制寄存器或仅适用于SSE2?
为了比较任何字符串而不考虑它们的情况,有各种C库函数,如strcasecmp()
,stricmp()
和stricmpi()
.这些有什么区别?