2011-02-06 28 views
7

Gần đây tôi đã chuyển từ máy tính xách tay 32 bit sang màn hình 64 bit (cả win7). Tôi vừa phát hiện ra rằng tôi gặp lỗi khi tải dll bằng cách sử dụng dyn.load. Tôi đoán đây là một sai lầm đơn giản và tôi đang nhìn cái gì đó.Sự cố khi tải mã c đã biên dịch trong R x64 bằng dyn.load

Ví dụ, tôi viết chức năng này đơn giản c (foo.c):

void foo(int *x) {*x = *x + 1;} 

Sau đó biên dịch nó trong dấu nhắc lệnh:

R CMD SHLIB foo.c 

Sau đó, trong 32bit RI có thể sử dụng nó trong R:

> dyn.load("foo.dll") 
> .C("foo",as.integer(1)) 
[[1]] 
[1] 2 

nhưng trong 64bit RI nhận được:

> dyn.load("foo.dll") 
Error in inDL(x, as.logical(local), as.logical(now), ...) : 
    unable to load shared object 'C:/Users/Sacha/Documents/R/foo.dll': 
    LoadLibrary failure: %1 is not a valid Win32 application. 
nd. 

Edit:

Để tham khảo, R CMD có thể bị buộc trong một cấu trúc bằng cách sử dụng --arch 64x:

R --arch x64 CMD SHLIB foo.c 

Khá rõ ràng trên thực tế, tôi biết tôi đã thực hiện một sai lầm rooky :)

Trả lời

4

Tôi đoán là bạn đang biên dịch nó thành mục tiêu 32 bit. Bạn cần phải xây dựng nó trên máy 64 bit của bạn với các công cụ 64 bit. Bạn không thể tải một DLL 32 bit vào một quá trình 64 bit, và ngược lại.

+0

Cảm ơn. Tôi đã xây dựng này trên máy 64bit của tôi với Rtools mới nhất được cài đặt. Có lẽ nó đang xây dựng phiên bản 32bit không? –

+0

bạn có thể kiểm tra điều này với Dependency Walker –

+0

Sử dụng nó và thực sự foo.dll là dành cho x86. Vì vậy, làm thế nào để buộc R CMD SHLIB để làm cho dll x64? –

-1

những gì tôi đã làm là biên dịch với --arch x64 và --arch 32 một lần và đặt thủ công .dll tương ứng (có cùng tên) trong thư mục riêng src-x64 và src-i386 tương ứng, hai thư mục này nằm trong cùng thư mục chứa thư mục src.

Các vấn đề liên quan