对不起,伙计们,但我整个早上都在为这个问题苦苦挣扎。 我为 Gold Parser 创建了一个解析器引擎,改进了现有引擎,添加了对 UTF-8 或 UNICODE 的完整支持以及错误处理。我希望它也可以在 Linux 上使用,因此我想在 Linux 上测试它,同时提高我使用此 SO(Ubuntu 22) 的技能并学习 Makefile。 为了急于在 stackoverflow 上问这个问题,我将所有内容上传到了 github 上。图书馆 是
mparser
,main
包含测试功能,dhash
是我的调试工具(仅检查内存泄漏),我包含了dhash
,所以我有一个更复杂的场景来学习Makefile。
问题是什么:它不能在 Linux 上运行。
我从这个网站Make教程复制了Makefile,在我理解了80%之后
我做了一些更改来运行我的项目,它可以在 github 上找到,但我也将其发布在这里:
IDIR =include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = dhash.h mparser.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
FDEPS =$(_DEPS)
_OBJ = mparser.o dhash.o main.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(FDEPS)
$(CC) -c -o $@ $< $(CFLAGS)
mparser: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
在Linux中,我将当前目录
.
添加到建议的路径中:here我运行
file mparser
,它说:mparser: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7b91119ab5e7a335c16c61c883ad5092da23eab5, for GNU/Linux 3.2.0, not stripped
executable
,正如建议的这里mparser
它会说拒绝访问。我也尝试过整个路径:
/media/jurhas/INTENSO/mparser
也不起作用。编辑:
“:权限被拒绝”当尝试执行某些操作时,总是意味着 Linux 文件权限。
您正在尝试在没有可执行标志的 Linux 文件系统上“执行”一个文件。
这是查看文件是否可执行的最简单方法:
user@host:~$ ls -lah file.txt
-rw-rw-r-- 1 myuser myusergroup 0 Jan 23 13:37 file.txt
你想看这个:
-rw-rw-r--
它指出:
rw-rw-r--
是大多数 Linux 发行版的默认设置。
您要做的就是使您的文件可执行。有很多方法可以实现这一点。
# before
user@host:~$ ls -lha file.txt
-rw-rw-r-- 1 user user 0 Jan 23 13:37 file.txt
# give everyone executable permissions
user@host:~$ chmod +x file.txt
# after
user@host:~$ ls -lha file.txt
-rwxrwxr-x 1 user user 0 Jan 23 13:37 file.txt
现在每个人都可以执行您的文件。这很可能不是您想要的。
user@host:~$ ls -lha file.txt
-rw-rw-r-- 1 user user 0 Jan 23 13:41 file.txt
user@host:~$ chmod u+x file.txt
user@host:~$ ls -lha file.txt
-rwxrw-r-- 1 user user 0 Jan 23 13:41 file.txt
您可以使用
u+x
作为 chmod 的参数,仅授予拥有该文件的用户执行权限。
如果这没有帮助,请尝试
mount | grep noexec
。如果您的文件位于使用 noexec 挂载的文件系统中,您将无法执行其中的文件。您可以更新您的 /etc/fstab
(列出启动时要挂载的内容的文件),删除 noexec 并使用 mount -o remount /path/to/mounted/dir
重新挂载目录