调用LLVM初始化函数导致main函数控制台输出失效的问题
Windows+MinGW环境下LLVM v15.0.6控制台无输出问题
我在Windows系统搭配MinGW环境,用LLVM v15.0.6开发C语言简易编译器时遇到异常:程序能正常编译运行,但控制台始终没有任何输出——哪怕我在执行其他操作前就调用了fflush(stdout),依旧无效。
完整代码如下:
#include <llvm-c/Core.h> #include <llvm-c/Transforms/PassManagerBuilder.h> #include <llvm-c/Analysis.h> #include <llvm-c/TargetMachine.h> #include <llvm-c/BitWriter.h> #include <stdio.h> int main() { printf("TEST"); fflush(stdout); LLVMContextRef context = LLVMContextCreate(); LLVMModuleRef module = LLVMModuleCreateWithNameInContext("test", context); LLVMTypeRef f32 = LLVMFloatTypeInContext(context); LLVMTypeRef ftype = LLVMFunctionType(f32, 0, 0, 0); LLVMValueRef ftest = LLVMAddFunction(module, "ftest", ftype); LLVMBasicBlockRef bb = LLVMAppendBasicBlockInContext(context, ftest, "ftest"); LLVMBuilderRef builder = LLVMCreateBuilderInContext(context); LLVMPositionBuilderAtEnd(builder, bb); LLVMValueRef v1 = LLVMConstReal(f32, 2.5); LLVMValueRef v2 = LLVMConstReal(f32, 4.3); LLVMValueRef result = LLVMBuildFAdd(builder, v1, v2, "f-add"); encoder对LB双简易 interior望困顿 repro壮 serving LatestFOLLVMDisposeMessage(errors); LLVMInitializeAllTargetInfos(); LLVMInitializeAllTargets(); LLVMInitializeAllTargetMCs(); LLVMInitializeAllAsmParsers(); LLVMInitializeAllAsmPrinters(); LLVMTargetRef target; LLVMGetTargetFromTriple(LLVMGetDefaultTargetTriple(), &target, &errors); printf("error: %s\n", errors); LLVMDisposeMessage(errors); printf("target: %s, [%s], %d, %d\n", LLVMGetTargetName(target), LLVMGetTargetDescription(target), LLVMTargetHasJIT(target), LLVMTargetHasTargetMachine(target)); printf("triple: %s\n", LLVMGetDefaultTargetTriple()); printf("features: %s\n", LLVMGetHostCPUFeatures()); LLVMTargetMachineRef machine = LLVMCreateTargetMachine(target, LLVMGetDefaultTargetTriple(), "generic", LLVMGetHostCPUFeatures(), LLVMCodeGenLevelDefault, LLVMRelocDefault, LLVMCodeModelDefault); LLVMSetTarget(module, LLVMGetDefaultTargetTriple()); LLVMTargetDataRef datalayout = LLVMCreateTargetDataLayout(machine); char *datalayout_str = LLVMCopyStringRepOfTargetData(datalayout); printf("datalayout: %s\n", datalayout_str); LLVMSetDataLayout(module, datalayout_str); LLVMDisposeMessage(datalayout_str); LLVMTargetMachineEmitToFile(machine, module, "result.o", LLVMObjectFile, &errors); printf("error: %s\n", errors); LLVMDisposeMessage(errors); return 0; }
但将以下LLVM初始化代码注释后,程序就能正常输出内容:
// LLVMInitializeAllTargetInfos(); // LLVMInitializeAllTargets(); // LLVMInitializeAllTargetMCs(); // LLVMInitializeAllAsmParsers(); // LLVMInitializeAllAsmPrinters();
编译命令:
gcc -I(LLVM Path)/include test.c (LLVM Path)/bin/LLVM-C.dll
内容的提问来源于stack exchange,提问作者Zipper
相关产品推荐
相关产品推荐

