gpt4 book ai didi

c++ - src/libdyld/MachOObject.cpp 中的编译错误;编译亲爱的

转载 作者:行者123 更新时间:2023-11-28 07:22:06 25 4
gpt4 key购买 nike

我正在编译亲爱的,在 libdyld 中编译 MachOObject.cpp 时失败了

我得到的错误

MachOObject.cpp:534:20: error: expected primary-expression before ‘void’
MachOObject.cpp:534:20: error: expected ‘)’ before ‘void’

编译器的错误是关于这个的

bool MachOObject::lookupDyldFunction(const char* name, void** addr)
{
LOG << "lookupDyldFunction: " << name << std::endl;

*addr = dlsym(RTLD_DEFAULT, name);

if (!*addr)
*addr = (void*) (void (*)()) []() { LOG << "Fake dyld function called\n"; };

return (*addr) != 0;

请注意,那是在一个 void 函数和一个命名空间中的函数,这不是我自己写的

阅读整篇文章,你会发现这是用 c++ 编写的

所有相关代码(批量删除)

http://pastebin.com/raw.php?i=j6kkkVee

github上的整个程序

https://github.com/LubosD/darling

最佳答案

好的,该代码是 C++11 代码,Fake dlyd 函数 是一个 lambda,并且仅受 clang 3.1 及以上版本和 g++ 4.5 及更新版本的支持。请注意,我无法使用系统随附的 g++ 4.6.2 编译 scce。

根据自述文件和有关如何构建代码的文档,您需要使用 clang 3.1 或更新版本,并且必须使用 -std=c++11 标志进行编译。如果您使用的编译器不完全支持该语法(就像您正在使用的编译器一样),那么您将看到此错误。

在这种情况下,您可以对代码进行微小的修改,将虚拟函数移到方法之外,只引用它以便编译,但这意味着您仍在使用未经测试的编译器,并且开发人员尚未将其称为受支持的机制。

这个的 scce 是:

#include <iostream>
#include <dlfcn.h>

bool lookupDyldFunction(const char* name, void** addr)
{
std::cerr << "lookupDyldFunction: " << name << std::endl;

*addr = dlsym(RTLD_DEFAULT, name);

if (!*addr)
*addr = (void*) (void (*)()) []() { std::cerr << "Fake dyld function called\n"; };

return (*addr) != 0;
}

使用 g++ 编译:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -std=c++0x -c lookup.cpp
lookup.cpp: In function ‘bool lookupDyldFunction(const char*, void**)’:
lookup.cpp:12:26: error: expected primary-expression before ‘void’
lookup.cpp:12:26: error: expected ‘)’ before ‘void’

使用 clang++ 编译(5.0,在 mac 上;我没有新的 linux clang ATM):

$ clang --version
Apple LLVM version 5.0 (clang-500.2.78) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
$ clang++ -std=c++11 -c lookup.cpp
$

即编译成功。

请注意 CMakeList.txt 中没有任何内容指定/需要编译器的文件;它只是确保将 -std=c++11 传递给编译器。

关于c++ - src/libdyld/MachOObject.cpp 中的编译错误;编译亲爱的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19266306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com