Need help with native extensions

I can’t build if i have 2 native extension. If i have only one of them everthing is ok. What am I doing wrong?
Extension 1

// myextension.cpp
// Extension lib defines
#define EXTENSION_NAME NativeDraw
#define LIB_NAME "NativeDraw"
#define MODULE_NAME "native_draw"

// include the Defold SDK
#include <dmsdk/sdk.h>

static int drawPixels(lua_State* L)
{	
	dmScript::LuaHBuffer* buffer = dmScript::CheckBuffer(L, 2);
	uint8_t* stream = 0x0;
	uint32_t size_ignored = 0;
	dmBuffer::HBuffer hBuffer = buffer->m_Buffer;
	dmBuffer::Result r = dmBuffer::GetStream(hBuffer, dmHashString64("rgb"), (void**)&stream, &size_ignored);
	//printf("size:%s",size_ignored);
	lua_getfield(L, 1, "width");
	lua_getfield(L, 1, "height");;
	double width = luaL_checknumber(L, -2);
	double height = luaL_checknumber(L, -1);
	lua_pop(L, 1);
	lua_pop(L, 1); 
	double size = width * height;
	lua_pushstring(L,"stream");
	lua_gettable(L, -3 );
	lua_pushstring(L,"leds");
	lua_gettable(L, -4 );
	for(int i=1; i<= size;i++){
		lua_rawgeti(L,-1,i);
		int color = (int)luaL_checknumber(L, -1);
		lua_pop(L, 1);
		int r = color >> 16;
		int g = (color & 0x00FF00) >> 8;
		int b= color & 0x0000ff;
		int id = i * 3;
		stream[id - 3] = r;
		stream[id - 2] = g;
		stream[id - 1] = b;
		//printf("i:%s",i);
	}
	lua_pop(L,1);
	
	return 1;
}

// Functions exposed to Lua
static const luaL_reg Module_methods[] =
{
	{"draw_pixels", drawPixels},
	{0, 0}
};

static void LuaInit(lua_State* L)
{
	int top = lua_gettop(L);
	// Register lua names
	luaL_register(L, MODULE_NAME, Module_methods);
	lua_pop(L, 1);
	assert(top == lua_gettop(L));
}

dmExtension::Result AppInitializeMyExtension(dmExtension::AppParams* params)
{
	return dmExtension::RESULT_OK;
}

dmExtension::Result InitializeMyExtension(dmExtension::Params* params)
{
	// Init Lua
	LuaInit(params->m_L);
	printf("Registered %s Extension\n", MODULE_NAME);
	return dmExtension::RESULT_OK;
}

dmExtension::Result AppFinalizeMyExtension(dmExtension::AppParams* params)
{
	return dmExtension::RESULT_OK;
}

dmExtension::Result FinalizeMyExtension(dmExtension::Params* params)
{
	return dmExtension::RESULT_OK;
}

DM_DECLARE_EXTENSION(EXTENSION_NAME, LIB_NAME, AppInitializeMyExtension, AppFinalizeMyExtension, InitializeMyExtension, 0, 0, FinalizeMyExtension)

Extension 2

// myextension.cpp
// Extension lib defines
#define EXTENSION_NAME NativeRaycasting
#define LIB_NAME "NativeRaycasting"
#define MODULE_NAME "native_raycasting"

// include the Defold SDK
#include <dmsdk/sdk.h>

static int castRay(lua_State* L)
{	
	return 1;
}

// Functions exposed to Lua
static const luaL_reg Module_methods[] =
{
	{"cast_ray", castRay},
	{0, 0}
};

static void LuaInit(lua_State* L)
{
	int top = lua_gettop(L);
	// Register lua names
	luaL_register(L, MODULE_NAME, Module_methods);
	lua_pop(L, 1);
	assert(top == lua_gettop(L));
}

dmExtension::Result AppInitializeMyExtension(dmExtension::AppParams* params)
{
	return dmExtension::RESULT_OK;
}

dmExtension::Result InitializeMyExtension(dmExtension::Params* params)
{
	// Init Lua
	LuaInit(params->m_L);
	printf("Registered %s Extension\n", MODULE_NAME);
	return dmExtension::RESULT_OK;
}

dmExtension::Result AppFinalizeMyExtension(dmExtension::AppParams* params)
{
	return dmExtension::RESULT_OK;
}

dmExtension::Result FinalizeMyExtension(dmExtension::Params* params)
{
	return dmExtension::RESULT_OK;
}

DM_DECLARE_EXTENSION(EXTENSION_NAME, LIB_NAME, AppInitializeMyExtension, AppFinalizeMyExtension, InitializeMyExtension, 0, 0, FinalizeMyExtension)

Errors

clojure.lang.ExceptionInfo: Failed to build engine, status 422: wine cl.exe /nologo /TP /O2 /Oy- /Z7 /MT /D__STDC_LIMIT_MACROS /DWINVER=0x0600 /D_WIN32_WINNT=0x0600 /DWIN32 /D_CRT_SECURE_NO_WARNINGS /wd4200 /W3 /EHsc /DDM_PLATFORM_WINDOWS /DLUA_BYTECODE_ENABLE   /Iupload/native_draw/include  /I/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//include /I/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//sdk/include /IC:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/INCLUDE /IC:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/ATLMFC/INCLUDE /IC:/ProgramFilesx86/WindowsKits/10/include/10.0.10240.0/ucrt /IC:/ProgramFilesx86/WindowsKits/NETFXSDK/4.6.1/include/um /IC:/ProgramFilesx86/WindowsKits/8.1/include/shared /IC:/ProgramFilesx86/WindowsKits/8.1/include/um /IC:/ProgramFilesx86/WindowsKits/8.1/include/winrt  upload/native_draw/src/native_draw.cpp /c /Fobuild/native_draw.cpp_0.o
native_draw.cpp

wine lib.exe /nologo /OUT:/tmp/job1258127913073868038/build/1b593900-1ca4-486b-9dc7-676989f086e5.lib build/native_draw.cpp_0.o 

wine cl.exe /nologo /TP /O2 /Oy- /Z7 /MT /D__STDC_LIMIT_MACROS /DWINVER=0x0600 /D_WIN32_WINNT=0x0600 /DWIN32 /D_CRT_SECURE_NO_WARNINGS /wd4200 /W3 /EHsc /DDM_PLATFORM_WINDOWS /DLUA_BYTECODE_ENABLE   /Iupload/native_raycasting/include  /I/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//include /I/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//sdk/include /IC:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/INCLUDE /IC:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/ATLMFC/INCLUDE /IC:/ProgramFilesx86/WindowsKits/10/include/10.0.10240.0/ucrt /IC:/ProgramFilesx86/WindowsKits/NETFXSDK/4.6.1/include/um /IC:/ProgramFilesx86/WindowsKits/8.1/include/shared /IC:/ProgramFilesx86/WindowsKits/8.1/include/um /IC:/ProgramFilesx86/WindowsKits/8.1/include/winrt  upload/native_raycasting/src/native_raycasting.cpp /c /Fobuild/native_raycasting.cpp_0.o
native_raycasting.cpp

wine lib.exe /nologo /OUT:/tmp/job1258127913073868038/build/71813fb1-d459-41a6-b572-de1e7674f114.lib build/native_raycasting.cpp_0.o 

wine cl.exe /nologo /TP /O2 /Oy- /Z7 /MT /D__STDC_LIMIT_MACROS /DWINVER=0x0600 /D_WIN32_WINNT=0x0600 /DWIN32 /D_CRT_SECURE_NO_WARNINGS /wd4200 /W3 /EHsc /DDM_PLATFORM_WINDOWS /DLUA_BYTECODE_ENABLE    /I/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//include /I/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//sdk/include /IC:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/INCLUDE /IC:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/ATLMFC/INCLUDE /IC:/ProgramFilesx86/WindowsKits/10/include/10.0.10240.0/ucrt /IC:/ProgramFilesx86/WindowsKits/NETFXSDK/4.6.1/include/um /IC:/ProgramFilesx86/WindowsKits/8.1/include/shared /IC:/ProgramFilesx86/WindowsKits/8.1/include/um /IC:/ProgramFilesx86/WindowsKits/8.1/include/winrt  build/main.cpp /c /Fobuild/main_tmp9f6033ab-7c79-45eb-a0b8-6196e6918957.o
main.cpp

wine link.exe build/main_tmp9f6033ab-7c79-45eb-a0b8-6196e6918957.o  /OUT:build/dmengine.exe /NOLOGO /MANIFEST /DELAYLOAD:LibFBGPlatform64.dll  /LIBPATH:/tmp/job1258127913073868038/build  /LIBPATH:/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//lib/x86_64-win32 /LIBPATH:/var/extender/sdk/0faa10db6bb28907d67358ad5810f3962437f3fd/defoldsdk//ext/lib/x86_64-win32 /LIBPATH:C:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/LIB/amd64 /LIBPATH:C:/ProgramFilesx86/MicrosoftVisualStudio14.0/VC/ATLMFC/LIB/amd64 /LIBPATH:C:/ProgramFilesx86/WindowsKits/10/lib/10.0.10240.0/ucrt/x64 /LIBPATH:C:/ProgramFilesx86/WindowsKits/NETFXSDK/4.6.1/lib/um/x64 /LIBPATH:C:/ProgramFilesx86/WindowsKits/8.1/lib/winv6.3/um/x64  OpenGL32.lib Delayimp.lib User32.lib shell32.lib Xinput9_1_0.lib openal32.lib WS2_32.lib IPHlpApi.lib DbgHelp.lib  71813fb1-d459-41a6-b572-de1e7674f114.lib 1b593900-1ca4-486b-9dc7-676989f086e5.lib  libengine.lib libwebviewext.lib libadtruthext.lib libprofilerext.lib libfacebookext.lib libgameroomext.lib libiapext.lib libpushext.lib libiacext.lib librecord.lib libgameobject.lib libddf.lib libresource.lib libgamesys.lib libgraphics.lib libphysics.lib libBulletDynamics.lib libBulletCollision.lib libLinearMath.lib libBox2D.lib librender.lib libscript.lib libluajit-5.1.lib libextension.lib libhid.lib libinput.lib libparticle.lib librig.lib libdlib.lib libdmglfw.lib libgui.lib libtracking.lib libcrashext.lib libliveupdate.lib libsound.lib vpx.lib libFBGPlatform.lib 
1b593900-1ca4-486b-9dc7-676989f086e5.lib(native_draw.cpp_0.o) : error LNK2005: "enum dmExtension::Result __cdecl AppFinalizeMyExtension(struct dmExtension::AppParams * __ptr64)" (?AppFinalizeMyExtension@@YA?AW4Result@dmExtension@@PEAUAppParams@2@@Z) already defined in 71813fb1-d459-41a6-b572-de1e7674f114.lib(native_raycasting.cpp_0.o)
1b593900-1ca4-486b-9dc7-676989f086e5.lib(native_draw.cpp_0.o) : error LNK2005: "enum dmExtension::Result __cdecl AppInitializeMyExtension(struct dmExtension::AppParams * __ptr64)" (?AppInitializeMyExtension@@YA?AW4Result@dmExtension@@PEAUAppParams@2@@Z) already defined in 71813fb1-d459-41a6-b572-de1e7674f114.lib(native_raycasting.cpp_0.o)
1b593900-1ca4-486b-9dc7-676989f086e5.lib(native_draw.cpp_0.o) : error LNK2005: "enum dmExtension::Result __cdecl FinalizeMyExtension(struct dmExtension::Params * __ptr64)" (?FinalizeMyExtension@@YA?AW4Result@dmExtension@@PEAUParams@2@@Z) already defined in 71813fb1-d459-41a6-b572-de1e7674f114.lib(native_raycasting.cpp_0.o)
1b593900-1ca4-486b-9dc7-676989f086e5.lib(native_draw.cpp_0.o) : error LNK2005: "enum dmExtension::Result __cdecl InitializeMyExtension(struct dmExtension::Params * __ptr64)" (?InitializeMyExtension@@YA?AW4Result@dmExtension@@PEAUParams@2@@Z) already defined in 71813fb1-d459-41a6-b572-de1e7674f114.lib(native_raycasting.cpp_0.o)

Hi @d954mas!

The errors at the end of the log mention that the symbols are already defined.
In this case that means that you have two places that define a function.
E.g. the AppInitializeMyExtension, which is called the same in both extensions.

I recommend addind the static keyword to those functions (as you see in LuaInit).
That way, the name of the symbol isn’t shown outside of that extension.

3 Likes

Thanks. :grinning: Add static is help. I bring code from https://www.defold.com/manuals/extensions/ , I think static should be here too.

2 Likes