Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±

    Компилятор плагина под Линукс

    Парни, подскажите , пожалуйста, способ и программу компиляции динамической библиотеки .so под Линуксом
    Пробую Code::Blocks с gcc/g++, но ему что-то не нравится, и он не говорит что. Пишет мне ошибку:
    Код HTML:
    ||error: ld returned 1 exit status|
    Может, я что-то делаю не так?

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Пока что ваш вопрос звучит примерно как "у меня какая-то ошибка, сможете угадать, что я делаю не так?" Сомневаюсь, что у нас на форуме есть экстрасенсы.
    Нужно больше информации. Выложите хотя бы минимальный проект плагина, на котором можно воспроизвести описанную вами ошибку.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±
    Извиняюсь за дубляж в разделе вопросов по pawn, просто мне довольно к спеху

    Дело в том, что я и сам не знаю, какая у меня ошибка, компилятор со мной этим не делится
    Код на данный момент выглядит примерно так:
    PHP код:
    #include "edlg.h"




    cell AMX_NATIVE_CALL FNC1(AMX *amxcell *params)
    {
        
    /*
        
        */
        
    return true;
    }

    PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
    {
        return 
    SUPPORTS_VERSION SUPPORTS_AMX_NATIVES;
    }

    PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
    {
        
    pAMXFunctions ppData[PLUGIN_DATA_AMX_EXPORTS];
        
    logprintf = (logprintf_tppData[PLUGIN_DATA_LOGPRINTF];

        
    logprintf("Success");
        return 
    true;
    }

    PLUGIN_EXPORT void PLUGIN_CALL Unload()
    {
        
    logprintf(" * unloaded.");
    }

    AMX_NATIVE_INFO PluginNatives[] =
    {
        {
    "plug_func1"FNC1},
        {
    00}
    };

    PLUGIN_EXPORT int PLUGIN_CALL AmxLoadAMX *amx )
    {
        return 
    amx_Register(amxPluginNatives, -1);
    }


    PLUGIN_EXPORT int PLUGIN_CALL AmxUnloadAMX *amx )
    {
        return 
    AMX_ERR_NONE;

    PHP код:
    // edlg.h

    #include "SDK/amx/amx.h"
    #include "SDK/plugincommon.h"



    typedef void(*logprintf_t)(charformat, ...);
    extern void *pAMXFunctions;
    logprintf_t logprintf;

    #define PLUGIN_FUNCTION cell AMX_NATIVE_CALL


    static char *pcCreateAndFillStringFromCell(AMX *amxcell params)
    {
        
    char *szDest;
        
    int nLen;
        
    cell *pString;
        
    amx_GetAddr(amxparams, &pString);
        
    amx_StrLen(pString, &nLen);
        
    szDest = new char[nLen 1];
        
    amx_GetString(szDestpString0UNLIMITED);
        return 
    szDest;


  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Выложите хотя бы минимальный проект плагина
    Когда я говорил "проект", я имел в виду именно весь проект, и не обязательно в том виде, как у вас сейчас, можно вырезать весь основной функционал плагина - главное, чтобы воспроизводилась та ошибка. Именно проект, а не пару исходных файлов, которые по сути здесь бесполезны, т.к. в них всё равно нет никаких синтаксических ошибок. Вполне возможно, что вы что-то напортачили в параметрах компиляции или ещё каких-нибудь настройках проекта.

    Ещё могу посоветовать в нижней части окна Code::Blocks переключиться с вкладки "Build log" на "Build messages" - обычно там оседает большая часть сообщений от компилятора и линковщика, без фильтрации, как в Build log. Запостите эти сообщения сюда.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. Пользователь сказал cпасибо:
    Edwin (20.11.2016)
  6. #5
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±
    Build log:
    Код HTML:
    -------------- Build: Debug in eDialog (compiler: GNU GCC Compiler)---------------
    
    g++ -Wall -fexceptions -g -m64  -c "/home/edwin/Рабочий стол/CodeBlocks Projects/eDialog/main.cpp" -o obj/Debug/main.o
    g++ -shared  obj/Debug/main.o  -o bin/Debug/libeDialog.so -m64  
    /usr/bin/ld: obj/Debug/main.o: перемещение R_X86_64_32 для `.rodata' не может использоваться при создании разделяемого объекта; перекомпилируйте с -fPIC
    obj/Debug/main.o: error adding symbols: Некорректное значение
    collect2: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    1 error(s), 0 warning(s) (0 minute(s), 0 second(s))
    Build Messages:
    Код HTML:
    ||=== Build: Debug in eDialog (compiler: GNU GCC Compiler) ===|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
     
    - - - Добавлено - - -

    Кстати, возможно, имеет значение то, что у меня 64-разрядная х86-совместимая архитектура Линукс
    Последний раз редактировалось Edwin; 20.11.2016 в 22:25.

  7. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Edwin Посмотреть сообщение
    Код:
    /usr/bin/ld: obj/Debug/main.o: перемещение R_X86_64_32 для `.rodata' не может использоваться при создании разделяемого объекта; перекомпилируйте с -fPIC
    Вот вы и получили ответ на свой вопрос: нужно скомпилировать исходные файлы с ключом -fPIC.
    В строке меню (в самом верху окна) выберите "Project" => "Build options...", в открывшемся окне в дереве конфигурации (слева) нажмите на пункт с именем вашего проекта, переключитесь на вкладку "Other compiler options" и добавьте туда строку "-fPIC".

    Цитата Сообщение от Edwin Посмотреть сообщение
    Кстати, возможно, имеет значение то, что у меня 64-разрядная х86-совместимая архитектура Линукс
    Не совсем, но близко. Значение имеют ключи компиляции -m32 и -m64. Если указать -m64 (как у вас), то плагин скомпилируется под 64-разрядную архитектуру и сервер не сможет загрузить его. Найдите у себя в параметрах компилятора -m64 и замените на -m32. Выше я написал, как это сделать, только вместо "Other compiler options" нужно смотреть вкладку "Compiler flags".
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. Пользователь сказал cпасибо:
    Edwin (20.11.2016)
  9. #7
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Вот вы и получили ответ на свой вопрос: нужно скомпилировать исходные файлы с ключом -fPIC.
    В строке меню (в самом верху окна) выберите "Project" => "Build options...", в открывшемся окне в дереве конфигурации (слева) нажмите на пункт с именем вашего проекта, переключитесь на вкладку "Other compiler options" и добавьте туда строку "-fPIC".
    К сожалению, это не помогло
    Код HTML:
    -------------- Build: Debug in eDialog (compiler: GNU GCC Compiler)---------------
    
    g++ -shared  obj/Debug/main.o  -o bin/Debug/libeDialog.so  
    /usr/bin/ld: obj/Debug/main.o: перемещение R_X86_64_32 для `.rodata' не может использоваться при создании разделяемого объекта; перекомпилируйте с -fPIC
    obj/Debug/main.o: error adding symbols: Некорректное значение
    collect2: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    1 error(s), 0 warning(s) (0 minute(s), 0 second(s))
     
    Код HTML:
    ||=== Build: Debug in eDialog (compiler: GNU GCC Compiler) ===|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
      Открыть/закрыть



    Пару раз я пытался скомпилировать это терминалом с ключом -fPIC, и тогда он ругался на вообще внутренние функции SDK, типа amx_Push, и т.д.
    Возможно, конечно, я неправильно что-то делал
    Последний раз редактировалось Edwin; 20.11.2016 в 15:52.

  10. #8
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±
    Странно, но после нескольких попыток пересборки (не меняя настроек) он всё-таки скомпилировался
    .so-шник получился, но вот работает он почему-то криво:
    Код HTML:
    // архитектура 32
    [16:28:53]  Loading plugin: eDialog32.so
    [16:28:53]   Failed (plugins/eDialog32.so: undefined symbol: pAMXFunctions)
    
    // архитектура 64
    [16:30:42]  Loading plugin: eDialog64.so
    [16:30:42]   Failed (plugins/eDialog64.so: wrong ELF class: ELFCLASS64)

  11. #9
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Убери extern отсюда:
    PHP код:
    extern void *pAMXFunctions

  12. Пользователь сказал cпасибо:
    Edwin (20.11.2016)
  13. #10
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Убери extern отсюда:
    PHP код:
    extern void *pAMXFunctions
    А его там итак нету
    Добавление ситуацию не изменило
    Последний раз редактировалось Edwin; 20.11.2016 в 21:32.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •