Emscripten - 如何将我的makefile与emcc一起使用而不是gcc?

Posted

技术标签:

【中文标题】Emscripten - 如何将我的makefile与emcc一起使用而不是gcc?【英文标题】:Emscripten - how to use my makefile with emcc instead of gcc? 【发布时间】:2018-05-21 09:49:13 【问题描述】:

我在 C 语言中有一个名为 Triple 的项目,您可以在其中添加、删除和匹配一些 Triplets。现在的想法是使用 emcc 和 emmake 将其转换为 html

我尝试编译它:

 emmake make

然后使用:

emcc triple.o -s WASM=1 -o triple.html

但我得到了错误:

WARNING:root:triple.o is not valid LLVM bitcode
ERROR:root:no input files
note that input files without a known suffix are ignored, make sure 
your input files end with one of: ('.c', '.C', '.i', '.cpp', '.cxx', 
'.cc', '.c++', '.CPP', '.CXX', '.CC', '.C++', '.ii', '.m', '.mi', 
'.mm', '.mii', '/dev/null', '.bc', '.o', '.obj', '.lo', '.dylib', 
'.so', '.a', '.ll', '.h', '.hxx', '.hpp', '.hh', '.H', '.HXX', '.HPP', 
'.HH')

我错过了什么?是否有另一种方法可以将 make 文件与 emcc 一起使用,而不是与 gcc 一起使用?

这是我正在使用的 make 文件。

CC=emcc
triple : triple.o insert.o match.o Delete.o printList.o writeList.o
    $(CC) -o triple triple.o insert.o match.o Delete.o printList.o 
    writeList.o

triple.o : triple.c
    $(CC) -g -c triple.c

insert.o : insert.c
    $(CC) -g -c insert.c

match.o : match.c
    $(CC) -g -c match.c

Delete.o : Delete.c
    $(CC) -g -c Delete.c

printList.o : printList.c
    $(CC) -g -c printList.c

writeList.o : writeList.c
    $(CC) -g -c writeList.c

【问题讨论】:

【参考方案1】:

emcc 程序是一个编译器前端。这意味着它将源代码作为输入。您不需要先使用 GCC 编译代码。 emscripten 网站说得最好:“在现有项目中使用 Emscripten 编译器前端 (emcc) 作为 gcc 的替代品。”

如果您有源代码,似乎没有充分的理由先编译为 LLVM。

您需要做的只是用 emcc 替换 Makefile 中对 gcc 的任何引用。

更好 - 添加一个CC 变量并使用它。例如 CC=emcc 然后将所有对编译器的引用替换为$(CC)。 $ 位是如何访问 Makefile 中的变量。使用变量意味着您以后可以轻松更改编译器。

【讨论】:

我明白你的意思,我用$(CC)替换了所有东西,显然它正在编译但我不会通过将gcc替换为emcc来获得任何html文件? 您是否从 GCC 中删除了旧的“*.o”文件?也许make 只是根据它们的时间戳认为它们是最新的?【参考方案2】:

您尚未为 .o 行指定输出目标,因此我认为它将构建为 a.o

尝试修改你的makefile说:

$(CC) -g -c triple.c -o triple.o

【讨论】:

以上是关于Emscripten - 如何将我的makefile与emcc一起使用而不是gcc?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Socket.io 和 emscripten 使用 javascript 库?

如何在编译期间指示 Emscripten 应该在哪里找到源文件?

如何在只有画布的情况下摆脱 emscripten 徽标和控制台?

如何使用库导入编译 C 文件到 webassembly 文件(Emscripten)

Emscripten:如何禁用警告:显式专业化不能有存储类

如何通过 Emscripten 激活抗锯齿