ошибка компиляции в src / libdyld / MachOObject.cpp; составление дорогая

0

Я компилировал милый, и он не удался при компиляции MachOObject.cpp в libdyld

ошибки, которые я получил

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

Теги:
compilation

1 ответ

1
Лучший ответ

Хорошо, код - код С++ 11, Fake dlyd function - это лямбда, и поддерживается только от clang 3.1 и далее и g++ 4.5 и новее. Имейте в виду, я не смог скомпилировать scce, используя g++ 4.6.2, отправленный с моей системой.

На основе readme и документации о том, как создать код, вам нужно использовать clang 3.1 или newer, и он должен скомпилироваться с использованием -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

скомпилированный с использованием клана g++ (5.0, на Mac, у меня нет нового баннера linux clang):

$ 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 передается компилятору.

  • 0
    этот код должен быть легче понять сейчас
  • 0
    Хорошо, код требует clang3.1 или новее и должен быть скомпилирован с -std = c ++ 11, что позволяет определять встроенные функции. Я обновлю ответ
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню