Русское сообщество по скриптингу

Правильная компиляция мета-плагина под линукс

Все вопросы по работе и настройке Metamod и его плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по Metamod и его плагинам.

Правильная компиляция мета-плагина под линукс

Сообщение kekys » 16 июн 2017, 22:08

Пытаюсь сделать свой первый плагин для метамода. Плагин-хелоувордщик. По этому Вы должны зарегистрироваться, чтобы видеть ссылки..

Однако при компиляции у меня вылазит куча ворнингов.

Помогите пожалуйста понять где ошибка. Есть 2 варианта:

1) Я криво компилю (я ведь новичек)
2) В гайде написано, что код для винды, а компилю я под линуксом.

Код: Выделить всё
In file included from ./include/metamod/sdk_util.h:55:0,
                 from ./include/metamod/dllapi.h:40,
                 from ./include/metamod/meta_api.h:40,
                 from src/main.cpp:2:
./include/dlls/util.h:249:70: warning: ‘typedef’ was ignored in this declaration
 typedef enum { point_hull=0, human_hull=1, large_hull=2, head_hull=3 };
                                                                      ^
In file included from ./include/metamod/dllapi.h:41:0,
                 from ./include/metamod/meta_api.h:40,
                 from src/main.cpp:2:
./include/metamod/osdep.h: In function ‘char* DLERROR()’:
./include/metamod/osdep.h:141:28: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    return("Invalid handle.");
                            ^
In file included from ./include/metamod/dllapi.h:41:0,
                 from ./include/metamod/meta_api.h:40,
                 from src/main.cpp:2:
./include/metamod/osdep.h: In function ‘int THREAD_CREATE(THREAD_T*, void (*)())’:
./include/metamod/osdep.h:297:59: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("Failure starting thread: %s", strerror(ret));
                                                           ^
./include/metamod/osdep.h:302:60: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("Failure detaching thread: %s", strerror(ret));
                                                            ^
./include/metamod/osdep.h: In function ‘int MUTEX_INIT(MUTEX_T*)’:
./include/metamod/osdep.h:329:53: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("mutex_init failed: %s", strerror(ret));
                                                     ^
./include/metamod/osdep.h: In function ‘int MUTEX_LOCK(MUTEX_T*)’:
./include/metamod/osdep.h:336:53: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("mutex_lock failed: %s", strerror(ret));
                                                     ^
./include/metamod/osdep.h: In function ‘int MUTEX_UNLOCK(MUTEX_T*)’:
./include/metamod/osdep.h:343:55: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("mutex_unlock failed: %s", strerror(ret));
                                                       ^
./include/metamod/osdep.h: In function ‘int COND_INIT(COND_T*)’:
./include/metamod/osdep.h:374:52: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("cond_init failed: %s", strerror(ret));
                                                    ^
./include/metamod/osdep.h: In function ‘int COND_WAIT(COND_T*, MUTEX_T*)’:
./include/metamod/osdep.h:381:52: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("cond_wait failed: %s", strerror(ret));
                                                    ^
./include/metamod/osdep.h: In function ‘int COND_SIGNAL(COND_T*)’:
./include/metamod/osdep.h:388:54: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    META_ERROR("cond_signal failed: %s", strerror(ret));
                                                      ^
src/main.cpp: At global scope:
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
 };
 ^
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
src/main.cpp:14:1: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
src/main.cpp: In function ‘int Meta_Query(char*, plugin_info_t**, mutil_funcs_t*)’:
src/main.cpp:26:50: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    ALERT(at_console, "[HELLOWORLD]: meta_query\n");
                                                  ^
src/main.cpp: In function ‘int Meta_Attach(PLUG_LOADTIME, META_FUNCTIONS*, meta_globals_t*, gamedll_funcs_t*)’:
src/main.cpp:32:51: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    ALERT(at_console, "[HELLOWORLD]: meta_attach\n");
                                                   ^
src/main.cpp: In function ‘int Meta_Detach(PLUG_LOADTIME, PL_UNLOAD_REASON)’:
src/main.cpp:38:51: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    ALERT(at_console, "[HELLOWORLD]: meta_detach\n");


Код: Выделить всё
COMPILER=g++
STANDART=c++11
INCLUDE=\
            -I./include\
            -I./include/common\
            -I./include/dlls\
            -I./include/engine\
            -I./include/pm_shared\
            -I./include/metamod

SOURCES
=\
            src/main.cpp

all
:
    $(COMPILER) $(SOURCES) -o metamod_helloworld.so -fPIC -shared $(INCLUDE)


Код: Выделить всё
#include <extdll.h>
#include <meta_api.h>

plugin_info_t info = {
   META_INTERFACE_VERSION,            // ifvers
   "HELLO WORLD",                  // name
   "1.01",                        // version
   "2011/01/15",                  // date
   "--===((((][@KIRjkeeee))))===--",   // author
   "http://ultra.ucoz.ru",            // url
   "HELLOWORLD",                  // logtag, all caps please
   PT_ANYTIME,                     // (when) loadable
   PT_ANYPAUSE                     // (when) unloadable
};

enginefuncs_t g_engfuncs;

void WINAPI GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals)
{
   memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
}

C_DLLEXPORT int Meta_Query(char *interfaceVersion, plugin_info_t **pinfo, mutil_funcs_t *pMetaUtilFuncs)
{
   *pinfo = &info;
   ALERT(at_console, "[HELLOWORLD]: meta_query\n");
   return(TRUE);
}

C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs)
{
   ALERT(at_console, "[HELLOWORLD]: meta_attach\n");
   return(TRUE);
}

C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
{
   ALERT(at_console, "[HELLOWORLD]: meta_detach\n");
   return(TRUE);



Ну а если подключить скомпиленую либу к метамоду, то во первых: никакого хеллоуворда не выведется, а во вторых при перезагрузке сервера будет Вы должны зарегистрироваться, чтобы видеть ссылки.

Возжно кто-то знает как запилить что бы все работало? Ну или гайдец для линукса. Пусть даже на енглише, буду с гуглопереводчиком пытаться перевести.

Название темы скорректировано // liFe iS GoOD
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось liFe iS GoOD 18 июн 2017, 13:31, всего редактировалось 2 раз(а).
Причина: Для отладочной информации используется тег [code]
Аватара пользователя
kekys
 
Сообщения: 20
Зарегистрирован: 13 июн 2017, 22:45
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
Языки программирования: C++, Js, Dm

Re: Правильная компиляция мета-плагина под линукс

Сообщение Bos93 » 17 июн 2017, 00:36

Он же не поддерживает линукс. Просто посмотри любой плагин на оленях или суб плагин, который идет к метамоду.


А то просто варнинги, на работу не должны влиять.

Попробуй так:
Код: Выделить всё
#include <extdll.h>
#include <meta_api.h>

#if _MSC_VER
    #if _MSC_VER >= 1400
        #define stricmp _stricmp
    #endif
#endif

#ifdef __linux__
    #define stricmp    strcasecmp
#endif

plugin_info_t info = {
   META_INTERFACE_VERSION,            // ifvers
   "HELLO WORLD",                  // name
   "1.01",                        // version
   "2011/01/15",                  // date
   "--===((((][@KIRjkeeee))))===--",   // author
   "http://ultra.ucoz.ru",            // url
   "HELLOWORLD",                  // logtag, all caps please
   PT_ANYTIME,                     // (when) loadable
   PT_ANYPAUSE                     // (when) unloadable
};

meta_globals_t *gpMetaGlobals;
mutil_funcs_t *gpMetaUtilFuncs;
enginefuncs_t g_engfuncs;
gamedll_funcs_t * gpGamedllFuncs;
globalvars_t  *gpGlobals;


C_DLLEXPORT    int    Meta_Query(char    *ifvers, plugin_info_t **pPlugInfo,    mutil_funcs_t *pMetaUtilFuncs)
{
    gpMetaUtilFuncs = pMetaUtilFuncs;

    *pPlugInfo = &Plugin_info;

    return(TRUE);
}

static META_FUNCTIONS gMetaFunctionTable;
C_DLLEXPORT    int    Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs)
{
    gpMetaGlobals = pMGlobals;
    gpGamedllFuncs = pGamedllFuncs;

    ALERT(at_console, "[HELLOWORLD]: meta_detach\n");

    memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
    return(TRUE);
}

#ifdef __linux__
// linux prototype
C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals)
{
#else
#ifdef _MSC_VER
// MSVC: Simulate __stdcall calling convention
C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals)
{
    __asm            // Prolog
    {
        // Save ebp
        push        ebp
        
// Set stack frame pointer
        mov            ebp, esp
        
// Allocate space for local variables
        // The MSVC compiler gives us the needed size in __LOCAL_SIZE.
        sub            esp, __LOCAL_SIZE
        
// Push registers
        push        ebx
        push        esi
        push        edi
    
}
#else    // _MSC_VER
#ifdef __GNUC__
// GCC can also work with this
C_DLLEXPORT void __stdcall GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals )
{
#else    // __GNUC__
// compiler not known
#error There is no support (yet) for your compiler. Please use MSVC or GCC compilers or contact the AMX Mod X dev team.
#endif    // __GNUC__
#endif // _MSC_VER
#endif // __linux__

    // ** Function core <--
    memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
    gpGlobals = pGlobals;
    // --> ** Function core

#ifdef _MSC_VER
    // Epilog
    if (sizeof(int*) == 8)
    {    // 64 bit
        __asm
        
{
            // Pop registers
            pop    edi
            pop    esi
            pop    ebx
            
// Restore stack frame pointer
            mov    esp, ebp
            
// Restore ebp
            pop    ebp
            
// 2 * sizeof(int*) = 16 on 64 bit
            ret 16
        
}
    }
    else
    
{    // 32 bit
        __asm
        
{
            // Pop registers
            pop    edi
            pop    esi
            pop    ebx
            
// Restore stack frame pointer
            mov    esp, ebp
            
// Restore ebp
            pop    ebp
            
// 2 * sizeof(int*) = 8 on 32 bit
            ret 8
        
}
    }
#endif // #ifdef _MSC_VER
}
 
Код: Выделить всё
#(C)2004-2005 AMX Mod X Development Team
# Makefile written by David "BAILOPAN" Anderson

HLSDK = ../../hlsdk-2.3-p3
MM_ROOT 
= ../metamod

### EDIT BELOW FOR OTHER PROJECTS ###

OPT_FLAGS = -O2 -funroll-loops --pipe -fomit-frame-pointer -fno-strict-aliasing
DEBUG_FLAGS 
= --ggdb3
CPP 
= g++
NAME = metamod_helloworld

BIN_SUFFIX_32 
= i386.so
BIN_SUFFIX_64 
= amd64.so

OBJECTS 
= metamod_helloworld.cpp


LINK 
=

INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
    -I$(MM_ROOT) -I$(HLSDK)/common -I$(HLSDK)/pm_shared -Isdk -Iinclude

GCC_VERSION 
:= $(shell $(CPP) -dumpversion >&| cut -b1)


ifeq "$(DEBUG)" "true"
    BIN_DIR = Debug
    CFLAGS 
= $(DEBUG_FLAGS)
else
    BIN_DIR = Release
    CFLAGS 
= $(OPT_FLAGS)
endif

CFLAGS += -DNDEBUG -Wall -Wno-char-subscripts -Wno-unknown-pragmas -Wno-write-strings -Wno-deprecated -Wno-non-virtual-dtor -fno-exceptions -DHAVE_STDINT_H -fno-rtti -m32

ifeq 
"$(AMD64)" "true"
    BINARY = $(NAME)_$(BIN_SUFFIX_64)
    CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 
else
    BINARY = $(NAME)_$(BIN_SUFFIX_32)
    CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
    OPT_FLAGS 
+= -march=i586
endif

OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)

$(
BIN_DIR)/%.o: %.cpp
    
$(CPP) $(INCLUDE) $(CFLAGS) -[email protected] -$<

all:
    mkdir -$(BIN_DIR)
    mkdir -$(BIN_DIR)/sdk
    
$(MAKE) metamod_helloworld

amd64
:
    $(MAKE) all AMD64=true

metamod_helloworld
: $(OBJ_LINUX)
    $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)

debug:    
    
$(MAKE) all DEBUG=true

default: all

clean
:
    rm -rf $(BIN_DIR)/sdk/*.o
    rm -rf $(BIN_DIR)/*.o
    rm -rf $(BIN_DIR)/$(NAME)_$(BIN_SUFFIX_32)
    rm -rf $(BIN_DIR)/$(NAME)_$(BIN_SUFFIX_64)
Всем добра, любви и осознанности.

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1425
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 513 раз.

Re: Правильная компиляция мета-плагина под линукс

Сообщение Kaido Ren » 17 июн 2017, 12:13

Я тут выкладывал давненько плугин, там очень мало кода в принципе. Открой его, там и makefile есть вроде
Вы должны зарегистрироваться, чтобы видеть ссылки.

п.с.: кстати да, модеры, я забыл от этого ака пароль давно, можно ли удалить акк или забанить?

Как ты мне дорог // liFe iS GoOD
Аватара пользователя
Kaido Ren
 
Сообщения: 56
Зарегистрирован: 20 апр 2016, 18:17
Забанен
Благодарил (а): 8 раз.
Поблагодарили: 15 раз.

Правильная компиляция мета плагина под линукс

Сообщение Warnerflist » 30 дек 2018, 12:21

подскажите , пожалуйста, способ и программу компиляции динамической библиотеки .so под Линуксом
Пробую Code::Blocks с gcc/g, но ему что-то не нравится, и он не говорит что. Пишет мне ошибку:
Код HTML:
Аватара пользователя
Warnerflist
 
Сообщения: 6
Зарегистрирован: 21 дек 2018, 21:24
Откуда: Panama
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года

Re: Правильная компиляция мета плагина под линукс

Сообщение Fedcomp » 30 дек 2018, 13:31

Warnerflist писал(а):подскажите , пожалуйста, способ и программу компиляции динамической библиотеки .so под Линуксом
Пробую Code::Blocks с gcc/g, но ему что-то не нравится, и он не говорит что. Пишет мне ошибку:
Код HTML:

что за код html?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4671
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 758 раз.
Поблагодарили: 1246 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Правильная компиляция мета-плагина под линукс

Сообщение maks » 02 янв 2019, 14:47

Для того чтобы успешно компилировать код надо с начало потренироваться на сборке простейших плагинов которые гарантированно собираются.

Для тренировки соберем плагин l4dtoolz под л4д2.
Для сборки лучше всего использовать 32 битную Ubuntu 14 - 16. gcc v4.6 - 6.0 (под более новые версии мало вероятно что собереш)
Установи компилятор:
sudo apt-get install gcc g++

Установи пакет git чтоб удобно было скачивать исходники с гитхаба:
sudo apt-get install git

По очереди набири данные команды в консоли и получиш результат:
Код: Выделить всё
mkdir -p alliedmodders
cd alliedmodders
git clone 
--depth=--branch=l4d2 https://github.com/alliedmodders/hl2sdk hl2sdk-l4d2
git clone --depth=--branch=1.10-dev https://github.com/alliedmodders/metamod-source mmsource-1.10
git clone --recursive https://github.com/TyUser/l4dtoolz
cd l4dtoolz
make 
-f l4d2_make


После успешной сборки увидиш в консоли примерно.
1.png


После того как освоишся со сборкой изучи модифицированную мною версию маке файла с которой и собирал данный плагин. Он прекрасно подойдет для сборки простейших метамод плагинов:
Вы должны зарегистрироваться, чтобы видеть ссылки. ... /l4d2_make

Для сборки большинства популярных плагинов используется система сборки ambuild которая в несколько раз более сложная для сборки. Поэтому если не осилиш на данном этапе то там и подавно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
maks
 
Сообщения: 44
Зарегистрирован: 15 сен 2011, 11:04
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: SourcePawn


Вернуться в Вопросы по Metamod и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1