好的,代码是 C++11 代码,Fake dlyd function
是 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
传递给编译器。