Hi!
I've been experiencing some problems while setting up a development
environment for metamod plugins using linux (Ubuntu Oneiric). On windows
everything work(ed) flawlessly but since I've changed OS I need to change
my tools (I previously used VS2008 ).
Everything works fine when compiling the stub plugin using the supplied
makefile (but it's a mess...) so I've been trying to create my own that I
can use for custom created plugins.
So to break it down; I am trying to compile the stub_plugin (on both
metamod and metamod-p) with my own makefile which is using the
following structure for source files:
Code:
-(project)
--(source) #contains custom source files (incl dllapi.cpp, sdk_util.cpp etc.)
--(include) #contains custom header files
--(build) #contains build output such as *.so and *.o
This might seem as a simple task but because of the ambiguous makefile
supplied it is hard to see what one is doing wrong. But more importantly,
the problem I'm having appears during the linking process.
The individual source files all compiles (with a few warnings, which also
appears if I use the supplied makefile) but when I link them all to form
the final *.so library it fails with the following output:
Code:
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -shared -ldl -lm -static-libgcc build/dllapi.o build/engine_api.o build/h_export.o build/meta_api.o build/sdk_util.o -o stub_mm_i386.so
build/engine_api.o: In function `GetEntityAPI2':
/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: multiple definition of `GetEntityAPI2'
build/dllapi.o:/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: first defined here
build/h_export.o: In function `GetEntityAPI2':
/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: multiple definition of `GetEntityAPI2'
build/dllapi.o:/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: first defined here
build/meta_api.o: In function `GetEntityAPI2':
/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: multiple definition of `GetEntityAPI2'
build/dllapi.o:/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: first defined here
build/sdk_util.o: In function `GetEntityAPI2':
/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: multiple definition of `GetEntityAPI2'
build/dllapi.o:/home/user/Desktop/metamod-p-1.19p32/stub/source/dllapi.cpp:106: first defined here
collect2: ld returned 1 exit status
make: *** [stub_mm_i386.so] Error 1
The weird thing is that the makefile output is practically identical (my makefile
compared to the supplied one). Here is the makefile I am using:
Code:
CC = gcc
CMNFLAGS = -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\""
CFLAGS = $(CMNFLAGS) -fPIC
LDFLAGS = $(CMNFLAGS) -shared -ldl -lm -static-libgcc
BUILD = build
SOURCE = source
INCLUDE = include
TARGET = $(shell basename $(CURDIR))_mm_i386.so
HLSDK = ../hlsdk
INCLUDES = -I$(INCLUDE) -I../metamod -I$(HLSDK)/engine -I$(HLSDK)/common \
-I$(HLSDK)/pm_shared -I$(HLSDK)/dlls -I$(HLSDK)
SOURCES = $(wildcard $(SOURCE)/*.cpp)
OBJECTS = $(foreach dir, $(SOURCES:.cpp=.o), $(BUILD)/$(notdir $(dir)))
.PHONY: clean
all: $(SOURCES) $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
$(OBJECTS): $(SOURCES)
$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
clean:
-rm -r $(BUILD)
Can anyone tell what's wrong?
And last but not least, here is the two make outputs;
The output generated by my own makefile (make | lee out.txt)
Code:
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -Iinclude -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o build/dllapi.o -c source/dllapi.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -Iinclude -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o build/engine_api.o -c source/dllapi.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -Iinclude -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o build/h_export.o -c source/dllapi.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -Iinclude -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o build/meta_api.o -c source/dllapi.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -Iinclude -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o build/sdk_util.o -c source/dllapi.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -shared -ldl -lm -static-libgcc build/dllapi.o build/engine_api.o build/h_export.o build/meta_api.o build/sdk_util.o -o stub_mm_i386.so
The makefile output generated by the supplied makefile:
Code:
gcc -MM -I. -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk dllapi.cpp engine_api.cpp h_export.cpp meta_api.cpp sdk_util.cpp | sed "s;\(^[^ ]*\):\(.*\);debug.linux_i386/\1: Makefile Config.mak \2;" > debug.linux_i386/Rules.depend
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -I. -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o debug.linux_i386/dllapi.o -c dllapi.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -I. -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o debug.linux_i386/engine_api.o -c engine_api.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -I. -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o debug.linux_i386/h_export.o -c h_export.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -I. -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o debug.linux_i386/meta_api.o -c meta_api.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -fPIC -I. -I../metamod -I../hlsdk/engine -I../hlsdk/common -I../hlsdk/pm_shared -I../hlsdk/dlls -I../hlsdk -o debug.linux_i386/sdk_util.o -c sdk_util.cpp
gcc -ggdb3 -Wall -Wno-unknown-pragmas -m32 -DOPT_TYPE="\"debugging\"" -shared -ldl -lm -static-libgcc debug.linux_i386/dllapi.o debug.linux_i386/engine_api.o debug.linux_i386/h_export.o debug.linux_i386/meta_api.o debug.linux_i386/sdk_util.o -o debug.linux_i386/stub_mm_i386.so
The only difference in the two outputs is that the supplied makefile issues
an additional call to gcc, but I do not quite understand what this call does
(new to both linux and the GNU toolchain) and I can not tell if it is of any
importance. I've tried using the call (gcc -MM ...) manually and then call
my own makefile but without avail. From my understanding the only thing
that line does is to output some data to rules.depend (am I correct?).
I'm so sorry for the long post and it was not intended to be this extensive. I do
know there aren't so many people out there who still possess knowledge about
metamod but I would appreciate it greatly if anyone could help me!
NOTE: Here's the supplied makefile (in case of interest):
http://pastebin.com/m01u2wAn
NOTE2: The source files have not been modified in any way
NOTE3: Since the errors is related to GetEntityApi2 which uses C_DLLEXPORT, could that
be related to the error somehow? I also run AMD64 which might require modifications
to the makefile.