我必须链接什么才能避免_aligned_alloc(MSVC命令行)上的链接器错误



我正试图使用cl命令行工具在Windows上构建一个简单的DLL,该DLL封装_aligned_alloc、_aligned_realloc和_alignex_free。我的源文件是一个.c文件,包括<stdlib.h>并且<malloc.h>,并且似乎可以用编译

cl /LD CustomAllocators.c /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

但随后未能链接,显示:

CustomAllocators.obj : error LNK2019: unresolved external symbol _aligned_alloc referenced in function Allocate
CustomAllocators.dll : fatal error LNK1120: 1 unresolved externals

所有这些/NODEFAULTLIB开关都是大量谷歌搜索的结果,看起来它们应该这样做,除非这些分配函数不在任何标准库中。。。但在这种情况下,我不知道他们可能在哪里。

有人能告诉我需要包含什么库来解析这些符号吗?或者如果我可能做错了什么?

根据[MS.Lean]:<cstdlib>-备注(强调是我的(:

这些函数具有在C标准库中指定的语义MSVC不支持aligned_alloc函数

您可能需要切换到[MS.Lean]:_aligned_malloc。

dll00.c

#include <stdio.h>
#include <stdlib.h>
#if defined(_WIN32)
#  define DLL00_EXPORT_API __declspec(dllexport)
#else
#  define DLL00_EXPORT_API
#endif

#if defined(__cplusplus)
extern "C" {
#endif
DLL00_EXPORT_API int dll00Func00();
#if defined(__cplusplus)
}
#endif

int dll00Func00()
{
void *p = _aligned_malloc(2048, 1024);
printf("Aligned pointer: %pn", p);
_aligned_free(p);
return 0;
}

输出(build-check[MS.Docs]:从命令行使用Microsoft C++工具集(:

[cfati@CFATI-5510-0:e:WorkDevStackOverflowq067809018]> sopr.bat
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###
[prompt]> "c:Installpc032MicrosoftVisualStudioCommunity2019VCAuxiliaryBuildvcvarsall.bat" x64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.10.0
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
[prompt]> dir /b
dll00.c
[prompt]>
[prompt]> cl /nologo /MD /DDLL dll00.c  /link /NOLOGO /DLL /OUT:dll00.dll
dll00.c
Creating library dll00.lib and object dll00.exp
[prompt]> dir /b
dll00.c
dll00.dll
dll00.exp
dll00.lib
dll00.obj
[prompt]>

测试.dll:

[prompt]> "e:WorkDevVEnvspy_pc064_03.08.07_test0Scriptspython.exe"
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import ctypes as cts
>>>
>>> dll = cts.CDLL("./dll00.dll")
>>> # This is for display purpose only. Skipping crucial steps. Don't do this in production!!!
>>> dll.dll00Func00()
Aligned pointer: 0000025E33A9A000
0

如注释中所述,跳过了某些方面(以保持代码简单(。Check[SO]:从Python通过ctypes调用的C函数返回错误的值(@CristiFati的答案(。

相关内容

  • 没有找到相关文章

最新更新