【问题标题】:Embedded Lua 5.4.2 Link Errors嵌入式 Lua 5.4.2 链接错误
【发布时间】:2021-07-10 18:09:30
【问题描述】:

我正在尝试使用 CLion IDE 和 CMake 使用嵌入在 C 中的 Lua,但我遇到了链接器错误。

运行这个程序时,我得到undefined symbol: _luaL_newstate

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main()
{
    lua_State *L = luaL_newstate();
    return 0;
}

这是我的 CMake 文件,它使用 CMake 内置的 FindLua.cmake 来查找包。我正在使用 CMake 选项-DCMAKE_CXX_FLAGS="-Wall -Wextra" -DCMAKE_C_FLAGS="-Wall -Wextra"

编辑:失败的 CMake 生成的链接器命令是 lld-link.exe /nologo @CMakeFiles\LuaProjk.dir\objects1.rsp /out:C:\Users\b\CLionProjects\LuaProjk\bin\LuaProjk.exe /implib:LuaProjk.lib /pdb:C:\Users\b\CLionProjects\LuaProjk\bin\LuaProjk.pdb /version:0.0 /machine:X86 /debug /INCREMENTAL /subsystem:console C:\Lua\lua54.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\LuaProjk.dir/intermediate.manifest CMakeFiles\LuaProjk.dir/manifest.res

cmake_minimum_required(VERSION 3.17)
project(LuaProjk C)

set(LUA_DIR /Lua)
set(LUA_INCLUDE_DIR /Lua/include)
find_package(Lua REQUIRED)
include_directories(${LUA_INCLUDE_DIR})

set(CMAKE_C_STANDARD 11)
set(SOURCE_FILES main.c)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../../bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../../lib)

add_executable(LuaProjk ${SOURCE_FILES})
target_link_libraries(LuaProjk ${LUA_LIBRARIES})

Lua 目录包含 lua54.dll 和 lua54.lib 文件,以及包含所有头文件的 include 目录。

我错过了什么吗?感谢您的帮助!

【问题讨论】:

  • 改为包含lua.hpp
  • @EgorSkriptunoff 这完全在 C11 中,C 无法识别 extern "C" 语句。 .hpp 命名约定旨在指定标头仅适用于 C++ 程序,并且可能无法在 C 中编译。
  • 您介意edit您的问题并发布执行的链接器命令吗? -- 哦,-DCMAKE_CXX_FLAGS 是否适用于 C 构建?我的意思是,“CXX”通常表示 C++,但我的 Cmake 经验相当低。
  • @thebusybee 我实际上不知道该选项(C 新手,但不是 C++),但我会发布完整的链接器命令。谢谢!
  • 您是在编译 32 位还是 64 位程序?你的 Lua 库与此匹配吗?

标签: c cmake lua linker


【解决方案1】:

你能编译这个吗? ...
(等等.c)

/* This is a wait function for Lua
   It uses unistd.h > usleep()
   so wait(1000000) is a second
*/
#include <unistd.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

static int wait_c(lua_State *L){
 long msecs=lua_tointeger(L,-1);
 usleep(msecs);
 return 0;
}

int wait(lua_State *L){
 lua_register(L,"wait",wait_c);  
 return 0;
}

在 linux 上 Makefile 看起来像:

all: wait.so

wait.so: wait.c
    gcc -shared -fPIC -o wait.so wait.c

clean:
    rm -v wait.so

...它可以通过两种方式加载...

  1. require('wait')
    ...或...
  2. package.loadlib('wait.so','wait')()
    ... *.so 是您当然需要的 linux 库:*.dll
    (我在 Windows 上没有用于 C 的 IDE ;-))

【讨论】:

  • 不,所有的 Lua 符号都是未定义的。
  • 啊,是的 - 你需要 Windows:stackoverflow.com/questions/3379139/…
  • 我已经用它的 windows 等价物替换了该部分,因为它不是手头问题的一部分,由于使用了未定义的 Lua 符号,程序仍然无法编译(这是链接时的问题,因为标题完美地工作)。
猜你喜欢
  • 2011-07-26
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2015-04-03
  • 2012-07-20
相关资源
最近更新 更多