我在构建独立的 webassembly 时遇到了问题,我想要完全控制内存和布局。我不想使用 emscripten 因为,正如下面的帖子所说,它没有给我我想要的所有编译时选项(例如堆栈大小控制,能够选择在独立模式下导入内存等。 ) 我一直在关注以下页面:如何使用 emscripten 生成独立的 webassembly 此外,emscripten 是矫枉过正。
到目前为止我所做的:我有一个通过自制软件下载的完全可用的 llvm 9 工具链(我在 macos 10.14 上。)我正在关注https://aransentin.github.io/cwasm/和https:// depth-first.com/articles/2019/10/16/compiling-c-to-webassembly-and-running-it-without-emscripten/
我使用 wasi 来获取 C 标准库。使用链接器标志,就像-Wl,-z,stack-size=$[1024 * 1024]我可以控制堆栈大小一样。编译成功。伟大的!
但是,我需要使用 C++ 标准库来支持我自己的一些和其他第三方库。据我所知,似乎没有任何简单的方法可以获得 libc++ 和 libc++abi。
我尝试了一个“hack”,我下载了 Emscripten 并让它构建了自己的 libc++ 和 libc++abi 文件。然后我尝试将这些文件和标题复制到正确的位置。然后我收到了关于缺少线程 API 的错误消息,这显然是由于没有使用 EMSCRIPTEN 编译造成的。所以我定义了EMSCRIPTEN宏并且这样工作。然后我想也许我可以删除 wasi 依赖项并使用 emscripten 的 libc 版本来保持一致,但随后也存在冲突/缺少标头。
简而言之,我想我已经接近我需要去的地方了,但事情变得非常混乱。我怀疑我采用了最简单的非脚本方法。
有没有人成功地为独立的 webassembly 创建了一个构建系统,让您可以使用 c 和 c++ 标准库?
编辑:
这是我现在拥有的超级 hacky 构建脚本(它是我在网上找到的东西的大量修改版本):
DEPS =
OBJ = library.o
STDLIBC_OBJ = $(patsubst %.cpp,%.o,$(wildcard stdlibc/*.cpp)) …Run Code Online (Sandbox Code Playgroud) 我试图了解如何使用libclang完成代码.我看过"思考超出编译器",我查看了c-index-test,我在这里找到了一个简单的示例程序
我编译了那个程序并在这个样本文件上运行它,我把它掀起来像是视频中的那个:
struct List {
int Data;
struct List *Next;
};
int sumListNode(struct List *Node) {
int result = 0;
for (; Node; Node = Node->Next)
result = result + Node->
}
void test() {
sumLi
}
Run Code Online (Sandbox Code Playgroud)
如果我在Node->之后将程序指向第一个不完整的空间,它会吐出几个C关键字,但它不会像视频所说的那样吐出Next或Data.
如果我将它指向sumLi之后的空格,它会打印出那些相同的C关键字.如果我将它指向sumLi中具有's'的列,我可以打印出sumListNode,但即便如此,它也会将其指定为与其他关键字相同的优先级值,所以它实际上只打印出我所有的内容可以放在那里,而不是阅读光标下的内容,并试图做出明智的猜测.我只是抓住吸管,希望无论如何将光标放在片段的开头而不是末尾都会有所帮助.
我已经了解了很多关于libclang可以给我的数据类型以及如何使用doxygen进行操作,以及在c-index-test中进行操作,但我还没学会如何让它给我相关数据,以便我有一些工作.
我正在尝试使用CMake文件编译Clang的RecursiveASTVisitor示例.构建项目进展顺利,但是链接C++可执行文件失败了多个未定义的LLVM和Clang库引用.我正在构建LLVM/Clang源文件树之外的示例.
这是我的CMakeLists.txt(我正在使用此项目中的FindClang.cmake和FindLLVM.cmake):
cmake_minimum_required(VERSION 2.8.4)
project(ifcount)
set(CMAKE_MODULE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules
${CMAKE_MODULE_PATH})
message(STATUS "CMAKE module path: ${CMAKE_MODULE_PATH}")
find_path(LibClang_INCLUDE_DIR clang-c/Index.h)
find_library(LIBCLANG_LIBRARY NAMES clang)
find_package(LLVM REQUIRED)
find_package(LLVM REQUIRED CONFIG)
Find_Package(LLVM REQUIRED)
include_directories(${LLVM_INCLUDE_DIR})
link_directories(${LLVM_LIB_DIR})
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
find_package(Clang REQUIRED)
find_package(Clang REQUIRED clangTooling libClang)
include_directories(${CLANG_INCLUDE_DIRS})
###
add_definitions(${LLVM_DEFINITIONS})
add_definitions(${Clang_DEFINITIONS})
add_definitions("-std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LLVM_COMPILE_FLAGS} -Wall -fno-rtti -g -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
set(SOURCE_FILES main.cpp)
add_executable(ifcount ${SOURCE_FILES})
llvm_map_components_to_libnames(llvm_libs support core irreader)
target_link_libraries(ifcount ${llvm_libs} ${LLVM_LDFLAGS} ${CLANG_LIBS})
Run Code Online (Sandbox Code Playgroud)
这是输出:
-- The C compiler identification …Run Code Online (Sandbox Code Playgroud) 我试图用C++编写代码,就像tail -f在linux中一样.我发现了这个问题:
如何在C++中阅读不断增长的文本文件?并实现了相同的.我创建了一个temp.txt并开始做echo "temp" >> temp.txt.但是我的程序没有打印对文件所做的更新.我做错了什么?这是我正在使用的代码
#include <iostream>
#include <string>
#include <fstream>
#include <unistd.h>
int main()
{
std::ifstream ifs("temp.txt");
if (ifs.is_open())
{
std::string line;
while (true)
{
while (std::getline(ifs, line)) std::cout << line << "\n";
if (!ifs.eof()) break; // Ensure end of read was EOF.
ifs.clear();
sleep(3);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
我在linux机器上尝试了相同的代码并且它工作正常,但它不适用于Mac.我gcc用来编译代码.
gcc -v 给
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: …Run Code Online (Sandbox Code Playgroud) Apple在macOS 10.13中提供的默认LLVM,High Sierra,OpenMP终于可用吗?它已经在主LLVM中可用了一年多了.
(提出问题的另一种方法可能是基于新的Apple LLVM的LLVM版本)
LLVM中的comdat代表什么?您可以在这里找到来源:Comdata
源级程序表示(c++)的示例将非常有帮助。
如果您需要更多信息,请随时询问。我在 llvm 代码库的很多地方找到它,但我无法弄清楚它到底是什么,以及它的用途
感谢您的帮助!
我很确定 glibc 是 gcc 的标准 C 库实现的名称。
但对于 LLVM/Clang,我不确定。我已经在谷歌上搜索过它是否带有整个标准 C 库的自己的实现,或者它们是否也使用 glibc。令人惊讶的是,我能找到的只是最近一篇讨论Google 正在考虑为 LLVM 编写新 libc 的文章。但不是那会取代什么。
即使在 LLVM/Clang 源代码库中,我也很有可能只是盲目或愚蠢,但我似乎找不到它。
明确地说,我只对 C 标准库感兴趣,而不是 C++ 标准库。我对研究它们printf对函数族的实现特别感兴趣。
有人可以告诉我在哪里可以找到 Clang 的 libc/标准 C 库实现或其源代码库吗?
clang-check -ast-dump -ast-dump-filter=<function_name> main.c给出特定代码的 AST(仅函数声明)。
我们如何以 JSON 格式表示生成的 AST?
PS:我只想要 AST 用于函数声明。
在我的一个检查器中,我使用FunctionDecl类来获取函数声明.现在我想获得我输入checkASTDecl方法的函数的名称.我们知道在checkASTDecl()中我们得到类FunctionDecl的指针.所以,任何人都可以帮助我获取我输入checkASTDecl的函数名称.
这是我写的示例代码:
namespace {
class FuncPrototypeChecker : public Checker<check::ASTDecl<FunctioeDecl> > {
mutable OwningPtr<BugType> TernaryOperatorBug;
public:
void checkASTDecl(const FunctionDecl *D,
AnalysisManager &mgr, BugReporter &BR) const;
};
Run Code Online (Sandbox Code Playgroud)
}
void FuncPrototypeChecker::checkASTDecl(const FunctionDecl *D,
AnalysisManager &mgr,
BugReporter &BR) const {
/* Get the name of the function from FunctionDecl *D */
}
Run Code Online (Sandbox Code Playgroud)
我想获取我输入方法FuncPrototypeChecker :: checkASTDecl()的函数的名称.请帮助我实现它的方式.提前致谢.
以下是处理类扩展的代码段.我要做的是生成一个称为内部ID的随机ID(稍后由程序使用),它以加密形式存储在内存中.代码无法使用gcc和clang编译(我在Windows上通过GNUStep运行Objective C),每个编译器都有不同的错误消息,在代码中作为注释提到.
请注意,我知道这个问题可以通过忽略主@faceface(即#import语句之后的那个)本身的扩展和声明方法和属性来轻松解决.我使用扩展的唯一原因是这个类是由一些其他子类继承的,"internalID"属性必须是不可访问的.
#import <Foundation/Foundation.h>
@interface Foo : NSObject
{
NSString * idStr;
}
- (void)setInternalID;
- (NSString *)fetchExternalID;
@end
// Extension declaration
@interface Foo()
{ // Compilation via gcc throws error at this line stating "Expected identifier or '(' before '{' token"
NSString *internalID; // Compilation via clang throws error at this line stating "instance variables may not be placed in class extension"
}
@end
@implementation Foo
- (void)setInternalID{
internalID = [NSString stringWithFormat:
@"__KEY__INTERNAL__DUMP2872167841398551___8765%d98KLPYFGF(&^$#ESFK___JNHGV",arc4random()%100];
}
- (NSString *)fetchExternalID{
NSString …Run Code Online (Sandbox Code Playgroud) llvm-clang ×10
clang ×5
c++ ×3
llvm ×3
macos ×2
clang++ ×1
cmake ×1
compilation ×1
gcc ×1
glibc ×1
gnustep ×1
json ×1
libc ×1
libclang ×1
llvm-c++-api ×1
llvm-ir ×1
objective-c ×1
openmp ×1
printf ×1
webassembly ×1