使用 CMAKE 如何包含和链接 Lua 5.1 库?

我对 CMake 还很陌生,感觉就像是一种黑魔法。 我使用的示例来自这里。 怎样才能在 CMake 中正确地包含 Lua(5.1)库并链接它呢?

在手动编译时可使用以下命令来编译示例:

$gcc -W -Wall -g -o main main.c -I/usr/local/include -L/usr/local/lib/lua/5.1 -llua

#include <stdio.h>
#include <string.h>

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

int main(void) {
    puts("lua 解释器:");
    char buff[256];
    int error;

    lua_State *L = luaL_newstate(); // 打开 Lua
    luaL_openlibs(L); // 打开标准库

    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); // 从栈中弹出错误信息
        }
    }
    lua_close(L);
    return 0;
}

current CMakeList.txt 如下:

cmake_minimum_required(VERSION 3.8)

project(test)

set(CMAKE_C_STANDARD 11)
set(SOURCE_FILES main.c)

include_directories(/usr/local/include)

add_executable(test ${SOURCE_FILES})

并且有下面的 err.log:

Undefined symbols for architecture x86_64:
  "_luaL_loadbufferx", referenced from:
      _main in main.c.o
  "_luaL_newstate", referenced from:
      _main in main.c.o
  "_luaL_openlibs", referenced from:
      _main in main.c.o
  "_lua_close", referenced from:
      _main in main.c.o
  "_lua_pcallk", referenced from:
      _main in main.c.o
  "_lua_settop", referenced from:
      _main in main.c.o
  "_lua_tolstring", referenced from:
      _main in main.c.o
点赞
用户3957200
用户3957200

你还没有将 Lua 库链接到可执行文件中。使用 target_link_libraries() 完成此操作。但首先你需要定位或指定库的位置。幸运的是,Lua 带有 一个用于查找 Lua 的 CMake 脚本

project(test)

find_package(Lua51 REQUIRED)

include_directories(/usr/local/include ${LUA_INCLUDE_DIR})

set(CMAKE_C_STANDARD 11)
set(SOURCE_FILES main.c)

add_executable(test ${SOURCE_FILES})
target_link_libraries(test ${LUA_LIBRARIES})
2017-10-24 21:22:38