質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

Q&A

解決済

1回答

3080閲覧

C言語からluaライブラリを呼び出したい

extremetriangle

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

0グッド

0クリップ

投稿2018/03/08 18:13

編集2018/03/08 18:29

目的

Ubuntu17.10,gcc6.3.0,lua5.3.4
でC言語からluaのスクリプトを呼び出す環境を作りたいと考えています。

しかし、コンパイル時点でエラーが出てしまいます。
何が間違っているのかご指摘下さい。
よろしくお願いします。

試したこと

①下記URLに従ってluaのソースコードをダウンロード、コンパイル
(インストール場所は~ディレクトリ)
http://www.lua.org/download.html

curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz tar zxf lua-5.3.4.tar.gz cd lua-5.3.4 make linux test

②ライブラリや*.hファイルが含まれる~lua-5.3.4/srcディレクトリにテストプログラム(test.cとhello.lua)を作成
2つのファイルは以下のサイトを使用しました。
http://www.hakkaku.net/articles/20081126-288

// file:test.c #include <stdio.h> #include "lua.h" #include "lualib.h" #include "lauxlib.h" int main(int argc, char* argv) { // Lua の言語エンジンを初期化 lua_State *lua = luaL_newstate(); // Luaのライブラリを使えるようにする luaL_openlibs(lua); // Luaのスクリプトを読み込む luaL_dofile(lua, "hello.lua"); return 0; }
-- hello.lua print("Hello, World!")

③liblua.aとリンクしてコンパイル

gcc -o test.out test.c -L. -llua

問題

③のコンパイルでエラーが出ました。

./liblua.a(lobject.o): 関数 `numarith.isra.0' 内: lobject.c:(.text+0x1d3): `fmod' に対する定義されていない参照です lobject.c:(.text+0x201): `pow' に対する定義されていない参照です lobject.c:(.text+0x215): `floor' に対する定義されていない参照です ./liblua.a(lvm.o): 関数 `luaV_tointeger' 内: lvm.c:(.text+0x2b7): `floor' に対する定義されていない参照です ./liblua.a(lvm.o): 関数 `luaV_execute' 内: lvm.c:(.text+0x1f0d): `floor' に対する定義されていない参照です lvm.c:(.text+0x2027): `fmod' に対する定義されていない参照です lvm.c:(.text+0x2684): `pow' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_log10' 内: lmathlib.c:(.text+0x9f): `log10' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_pow' 内: lmathlib.c:(.text+0x1b4): `pow' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_tanh' 内: lmathlib.c:(.text+0x1df): `tanh' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_sinh' 内: lmathlib.c:(.text+0x20f): `sinh' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_cosh' 内: lmathlib.c:(.text+0x23f): `cosh' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_tan' 内: lmathlib.c:(.text+0x26f): `tan' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_sqrt' 内: lmathlib.c:(.text+0x2ce): `sqrt' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_sin' 内: lmathlib.c:(.text+0x2ef): `sin' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_log' 内: lmathlib.c:(.text+0x631): `log' に対する定義されていない参照です lmathlib.c:(.text+0x645): `log' に対する定義されていない参照です lmathlib.c:(.text+0x676): `log10' に対する定義されていない参照です lmathlib.c:(.text+0x686): `log' に対する定義されていない参照です lmathlib.c:(.text+0x696): `log2' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_exp' 内: lmathlib.c:(.text+0x6ef): `exp' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_cos' 内: lmathlib.c:(.text+0x71f): `cos' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_atan' 内: lmathlib.c:(.text+0x77c): `atan2' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_asin' 内: lmathlib.c:(.text+0x7af): `asin' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_acos' 内: lmathlib.c:(.text+0x7df): `acos' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_ceil' 内: lmathlib.c:(.text+0x890): `ceil' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_modf' 内: lmathlib.c:(.text+0x8f3): `floor' に対する定義されていない参照です lmathlib.c:(.text+0x971): `ceil' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_floor' 内: lmathlib.c:(.text+0x9a0): `floor' に対する定義されていない参照です ./liblua.a(lmathlib.o): 関数 `math_fmod' 内: lmathlib.c:(.text+0xb0f): `fmod' に対する定義されていない参照です ./liblua.a(loadlib.o): 関数 `lookforfunc' 内: loadlib.c:(.text+0x534): `dlsym' に対する定義されていない参照です loadlib.c:(.text+0x581): `dlerror' に対する定義されていない参照です loadlib.c:(.text+0x5b6): `dlopen' に対する定義されていない参照です loadlib.c:(.text+0x62f): `dlerror' に対する定義されていない参照です ./liblua.a(loadlib.o): 関数 `gctm' 内: loadlib.c:(.text+0x7df): `dlclose' に対する定義されていない参照です collect2: error: ld returned 1 exit status

###補足
過程①のluaのmakeにあたって、必要だったReadlineライブラリは以下のパッケージから取得しました。

gcc apt-get install liblua5.3-dev

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Luaに関しては詳しくないのですが、最初に言えることとしては、LuaのモジュールがCのライブラリを必要としているようです。

これらの関数はmath.hとdlfcn.hというヘッダファイルにまとめられていますが、環境変数かオプションで指定しないと読み込んでくれません。

3番目のコンパイルコマンドを

gcc -o test.out test.c -L. -llua -lm -lld

と変えてみてください。
ある程度エラーが減る。もしくは、無くなるはずです。

投稿2018/03/08 18:34

GrayWingAliance

総合スコア218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extremetriangle

2018/03/08 18:46

ご指摘頂いたコマンドを参考に gcc -o test.out test.c -L. -llua -lm -ldl と入力してみたら、正常にコンパイル&実行できました! ありがとうございます! 参考までに、どこから問題をご判断されたのか伺ってもよろしいでしょうか?
extremetriangle

2018/03/08 18:56 編集

エラーメッセージからmath.hとdlfcn.hの読み込みが必要だと推測する必要があったのですね。 gccの静的ライブラリのリンクについて、まだまだ理解が浅いと実感しました。
GrayWingAliance

2018/03/08 19:00 編集

まず、-lldでなく、-ldlだったことにお詫びを。。。汗 エラー文の頭から {ファイル名}:(.text+{アドレス}): `{関数名}' に対する定義されていない参照です という文がいくつも並んでいると思います。 これらは、その関数がコンパイラに読み込まれていないために表示されるものです。 自分で書いたコードがほとんどない状態で、このエラーが表示される場合は、大抵ライブラリのロードが足りていない場合です。 linuxを使用している場合は、コマンドライン上で man {関数名} と入力するとマニュアルが出てきます。 それを読むとライブラリ読み込みが必要な場合は、SYNOPSISの欄に Link with -l{ライブラリ名} という形で、ライブラリ名が出てきます。 できない場合はネットで、man {関数名}と検索しても出てくると思います。
extremetriangle

2018/03/09 09:17

>自分で書いたコードがほとんどない状態で、このエラーが表示される場合は、大抵ライブラリのロードが足りていない場合 確かに、これが分かっていれば原因の候補を絞ることができますね。 manコマンドのマニュアルが関数にも対応しているとは知りませんでした。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問