что я должен связать, чтобы избежать ошибки компоновщика в _aligned_alloc (командная строка MSVC)?

#visual-c #linker #malloc #cl

Вопрос:

Я пытаюсь создать простую библиотеку DLL в Windows, которая обертывает _aligned_alloc, _aligned_realloc и _aligned_free, используя инструменты командной строки cl. Мой исходный файл представляет собой файл .c, включает <stdlib.h> и <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 являются результатом большого поиска в Интернете и, похоже, должны это делать, если только эти функции распределения просто не находятся ни в одной из этих стандартных библиотек… но в таком случае я понятия не имею, где они могут быть.

Может ли кто-нибудь сказать мне, какую библиотеку мне нужно включить, чтобы разрешить эти символы, или если я что-то еще делаю неправильно?

Комментарии:

1. Проверить docs.microsoft.com/en-us/cpp/c-runtime-library/reference/. … Эти /NODEFAULTLIB бесполезны.

Ответ №1:

Согласно [MS. Docs]: <cstdlib> — Примечания<cstdlib> (выделено мной):

Эти функции имеют семантику, указанную в стандартной библиотеке C. MSVC не поддерживает эту aligned_alloc функцию.

Возможно, вы захотите переключиться на [MS. Docs]: _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;
}
 

Вывод (проверка сборки [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 ct
>>>
>>> dll = ct.CDLL("./dll00.dll")
>>> # This is for display purpose only. Skipping crucial steps. Don't do this in production!!!
>>> dll.dll00Func00()
Aligned pointer: 0000025E33A9A000
0
 

Комментарии:

1. Это удивительно полный и полезный ответ, и он заставил меня отклеиться. Спасибо!