Я пытаюсь расширить Python на C++. Я использую Visual C++ 2008 и Python 2.7. У меня было много проблем, строящих файл .dll, и, наконец, когда казалось, что все правильно, я не могу перестать получать эту ошибку:ошибка LNK2001: неразрешенный внешний символ __imp__Py_InitModule4
ошибка LNK2001: неразрешенный внешний символ _ IMP _Py_InitModule4
Я знаю, что это не ошибка компоновщика, потому что у меня была эта ошибка раньше (она дала мне ошибку, но со всеми типами Py _... функции), и я решил это.
Я не знаю, являются ли это важными данными, но у меня также есть python27_d.dll с VC++ 2008.
Это код:
#include "Python.h"
#include <windows.h>
#include <string.h>
#include <tchar.h>
#include <stdlib.h>
#include <Aclapi.h>
struct file_perms {
char user_domain[2050];
unsigned long user_mask;
};
void lookup_sid (ACCESS_ALLOWED_ACE* pACE, char user_domain[]) {
char username[1024]="";
char domain[1024]="";
ULONG len_username = sizeof(username);
ULONG len_domain = sizeof(domain);
PSID pSID =(PSID)(&(pACE->SidStart));
SID_NAME_USE sid_name_use;
LPWSTR username1 = reinterpret_cast<LPWSTR>(username);
LPWSTR domain1 = reinterpret_cast<LPWSTR>(domain);
if (!LookupAccountSid(NULL, pSID, username1, &len_username, domain1, &len_domain, &sid_name_use)){
strcpy(user_domain, "unknown");
} else {
strcat(user_domain,domain);
strcat(user_domain,"\\");
strcat(user_domain,username);
}
}
void acl_info(PACL pACL, ULONG AceCount, file_perms fp[]){
for (ULONG acl_index = 0;acl_index < AceCount;acl_index++){
ACCESS_ALLOWED_ACE* pACE;
if (GetAce(pACL, acl_index, (PVOID*)&pACE))
{
char user_domain[2050]="";
lookup_sid(pACE,user_domain);
strcpy(fp[acl_index].user_domain,user_domain);
fp[acl_index].user_mask=(ULONG)pACE->Mask;
}
}
}
static PyObject *get_perms(PyObject *self, PyObject *args)
{
PyObject *py_perms = PyDict_New();
//get file or directory name
char *file;
if (!PyArg_ParseTuple(args, "s", &file))
return NULL;
//setup security code
PSECURITY_DESCRIPTOR pSD;
PACL pDACL;
//GetNamedSecurityInfo() will give you the DACL when you ask for
//DACL_SECURITY_INFORMATION. At this point, you have SIDs in the ACEs contained in the DACL.
LPWSTR file1 = reinterpret_cast<LPWSTR>(file);
ULONG result = GetNamedSecurityInfo(file1,SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL,
&pDACL, NULL, &pSD);
if (result != ERROR_SUCCESS){ return NULL;}
if (result == ERROR_SUCCESS){
ACL_SIZE_INFORMATION aclSize = {0};
if(pDACL != NULL){
if(!GetAclInformation(pDACL, &aclSize, sizeof(aclSize),
AclSizeInformation)){
return NULL;
}
}
file_perms *fp = new file_perms[aclSize.AceCount];
acl_info(pDACL, aclSize.AceCount, fp);
//Dict
for (ULONG i=0;i<sizeof(fp);i++){
PyObject *domain = Py_BuildValue("s",fp[i].user_domain);
PyObject *user = Py_BuildValue("s",fp[i].user_mask);
PyDict_SetItem(py_perms,domain,user);
}
}
return py_perms;
};
static PyMethodDef fileperm_methods[] = {
{ "get_perms", get_perms, METH_VARARGS, "Execute a shell command." },
{ NULL, NULL, 0, NULL }
};
extern "C"
__declspec(dllexport)
void init_fileperm(void)
{
PyObject *m=Py_InitModule("fileperm",fileperm_methods);
return;
}
Я работаю в Windows 7, 64bits.
Я знаю, что Py_InitModule устарел для Python 3, но я работаю в Python27 (2.7.3).
Кто-нибудь знает, почему я получаю эту ошибку?
Спасибо!
Вы говорите: «Я знаю, что это не ошибка компоновщика», но этот код ошибки LNK2001 - это именно то! Вы забыли добавить .lib в проект (или использовать #pragma comment (lib, "whatever.lib")) –
Библиотека Py_InitModule - это Python.h. Раньше у меня была эта ошибка, у меня было больше ошибок (по одной для каждой из функций, которые я использую из этой библиотеки). Но потом я добавил библиотеку, и все эти ошибки исчезли, кроме этого. Вот почему я так говорю; библиотека там, поэтому должна быть другая ошибка. – user1930068