2013-02-22 4 views
1

Я пытаюсь расширить 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).

Кто-нибудь знает, почему я получаю эту ошибку?

Спасибо!

+0

Вы говорите: «Я знаю, что это не ошибка компоновщика», но этот код ошибки LNK2001 - это именно то! Вы забыли добавить .lib в проект (или использовать #pragma comment (lib, "whatever.lib")) –

+0

Библиотека Py_InitModule - это Python.h. Раньше у меня была эта ошибка, у меня было больше ошибок (по одной для каждой из функций, которые я использую из этой библиотеки). Но потом я добавил библиотеку, и все эти ошибки исчезли, кроме этого. Вот почему я так говорю; библиотека там, поэтому должна быть другая ошибка. – user1930068

ответ

1

У меня была та же проблема. Если вы компилируете 64-разрядный pyd, убедитесь, что python27.lib также является 64-разрядным (то же самое касается компиляции 32-разрядного pyd с 32-битным python27.lib).

+0

Спасибо, хороший ответ. Линкер не смог найти символы, несмотря на связь с python27.lib. Исправлена ​​проблема с установкой библиотеки x64. – Tomis

Смежные вопросы