2010-11-10 29 views
5

Tôi đã chương trình Lua tầm thường sau đó chúng tôi đã copy từ Programming cuốn sách Trong LuaKhông thể liên kết một chương trình Lua tối thiểu

#include <stdio.h> 
#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 
int main (void) 
{ 
    char buff[256]; 
    int error; 
    lua_State *L = luaL_newstate(); /* opens Lua */ 
    luaL_openlibs(L); /* opens the standard libraries */ 
    while (fgets(buff, sizeof(buff), stdin) != NULL) 
    { 
     error = luaL_loadbuffer(L, buff, strlen(buff), "line") || 
     lua_pcall(L, 0, 0, 0); 

     if (error) 
     { 
      fprintf(stderr, "%s", lua_tostring(L, -1)); 
      lua_pop(L, 1); /* pop error message from the stack */ 
     } 
    } 
    lua_close(L); 
    return 0; 
} 

môi trường của tôi là cywin

làm cho tập tin của tôi trông như thế này:

CC=gcc 
INCLUDE='-I/home/xyz/c_drive/Program Files/Lua/5.1/include' 
LINKFLAGS='-L/home/xyz/c_drive/Program Files/Lua/5.1/lib' -llua51 

li.o:li.c 
    $(CC) $(INCLUDE) -c li.c 

main:li.o 
    $(CC) -o main $(LINKFLAGS) li.o 

clean: 
    rm *.o 
    rm main 

My/home/xyz/c_drive/Program Files/thư mục Lua/5.1/lib chứa lua5.1.dll lua5.1.lib lua51.dll và lua51.lib

Đang cố gắng để xây dựng mục tiêu chính của tôi Tôi nhận được các lỗi sau đây:

li.o:li.c:(.text+0x35): undefined reference to `_luaL_newstate' 
li.o:li.c:(.text+0x49): undefined reference to `_luaL_openlibs' 
li.o:li.c:(.text+0xaf): undefined reference to `_luaL_loadbuffer' 
li.o:li.c:(.text+0xd9): undefined reference to `_lua_pcall' 
li.o:li.c:(.text+0x120): undefined reference to `_lua_tolstring' 
li.o:li.c:(.text+0x154): undefined reference to `_lua_settop' 
li.o:li.c:(.text+0x167): undefined reference to `_lua_close' 

Bất kỳ ý tưởng về những gì tôi có thể làm sai ở đây?

+0

Bạn đã xây dựng lua51.lib như thế nào? Nếu lib được biên dịch bằng trình biên dịch C++ thì chương trình của bạn cũng phải được biên dịch (và liên kết) với trình biên dịch C++. – torus

+0

Tôi đã tải xuống phiên bản bin từ trang web của lua ... Trình biên dịch tôi sử dụng là gcc (không phải g ++) .....Tôi sẽ cố gắng tải về mã nguồn và biên dịch nó – JohnP

+0

Có một số phiên bản nhị phân khác nhau ở đó, được xây dựng với các trình biên dịch khác nhau. Bạn đã nhận được gói cụ thể nào? – Mud

Trả lời

9

Sự cố là bạn đã đặt tên cho thư viện trên dòng lệnh liên kết trước các tệp đối tượng yêu cầu chúng. Trình liên kết tải các mô-đun từ trái sang phải trên dòng lệnh. Tại điểm trên dòng nơi bạn đặt tên là -llua51, không có ký hiệu không xác định nào có thể được thư viện đó thỏa mãn. Sau đó, bạn đặt tên là li.o, có biểu tượng không xác định.

Một số môi trường giống Unix không coi đây là lỗi vì một phần của quy trình liên kết được trì hoãn cho tải chương trình khi tham chiếu đến các tệp .so được thỏa mãn. Nhưng Cygwin, MinGW và Windows nói chung phải coi đây là lỗi vì các tệp DLL hoạt động khá khác với các tệp .so.

Giải pháp là đặt -llua51sau tất cả các tệp .o trên dòng liên kết của bạn.

Chỉnh sửa: Ngẫu nhiên, có vẻ như bạn đang liên kết với bản phân phối Lua cho Windows, nhưng xây dựng với GCC dưới Cygwin. Bạn sẽ muốn sử dụng Dependency Walker để đảm bảo rằng chương trình của bạn không phụ thuộc vào thời gian chạy Cygwin, và nó phụ thuộc vào cùng thời gian chạy C như lua51.dll từ Lua cho Windows. IIRC, đó sẽ là thời gian chạy cho phiên bản trước của Visual Studio. Nó có thể làm cho GCC liên kết với điều đó, nhưng bạn sẽ cần phải sử dụng cổng MinGW (mà bạn có thể sử dụng từ Cygwin), và liên kết với một vài thư viện cụ thể để có được phiên bản đó. Tôi đang đi từ máy tính thông thường của tôi, hoặc tôi muốn trích dẫn một đường liên kết chính xác. (Tôi tin rằng bạn cần -lmoldname -lmsvcr80 hoặc một cái gì đó tương tự như các mục cuối cùng trên đường liên kết.)

Nó sẽ gây ra các vấn đề khó chẩn đoán và bí ẩn nếu có nhiều hơn một thư viện thời gian chạy C đang được sử dụng. Câu trả lời dễ dàng là sử dụng cùng một như Lua DLL ưa thích của bạn. Một lựa chọn khác là Lua Binaries project đã biên dịch trước Lua DLL cho một mảng rộng các công cụ C trên Windows. Nếu bạn cần một ứng dụng Lua hiểu môi trường Cygwin, bạn sẽ muốn một ứng dụng được xây dựng bởi GCC cho Cygwin và không phải là Lua cho hương vị Windows. Lua Binaries sẽ là bạn của bạn, hoặc bạn có thể tự xây dựng Lua từ nguồn.

+0

Cảm ơn sự giúp đỡ ... Có, thêm -llua51 ở cuối dòng liên kết giải quyết vấn đề biên dịch. Bởi vì tôi vẫn còn một số vấn đề chạy thực thi (cho phép bị từ chối) Tôi chỉ cần tải về mã nguồn của lua và xây dựng nó bằng cách sử dụng make mingw. Điều này dường như giải quyết vấn đề ... – JohnP

0

Tên trong API Lua làm không phải có những dấu gạch dưới hàng đầu. Thử biên dịch với -fno-leading-underscore.

+0

) dấu gạch dưới là một phần của tên mangling bình thường của C, và không phải là vấn đề ở đây. Nếu chúng có vẻ là vấn đề, thì có khả năng bạn có Lua DLL cho Windows được biên dịch để sử dụng với trình biên dịch của trình biên dịch C sai. – RBerteig

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