Question

I'm trying to build the XPCOM component available here: http://mxr.mozilla.org/mozilla-central/source/xpcom/sample/

I tried to compile it with my own Makefile, so that this component could be isolated from the whole Mozilla sources.

So here is my file tree:

frinux@Bureau /cygdrive/c/dev/central_sample
$ ls -Rlah
.:
total 57K
d---------+ 1 frinux None    0 Jan 15 21:28 .
d---------+ 1 frinux None    0 Jan 15 20:34 ..
----------+ 1 frinux None  989 Jan 15 21:22 Makefile
----------+ 1 frinux None 2.4K Jan 15 21:05 nsISample.idl
----------+ 1 frinux None 6.0K Jan 15 21:05 nsSample.cpp
----------+ 1 frinux None 5.1K Jan 15 21:06 nsSample.h
----------+ 1 frinux None 2.0K Jan 15 21:06 nsSample.js
----------+ 1 frinux None  131 Jan 15 21:06 nsSample.manifest
----------+ 1 frinux None 4.7K Jan 15 21:06 nsSampleModule.cpp
d---------+ 1 frinux None    0 Jan 15 21:28 program
----------+ 1 frinux None 8.7K Jan 15 21:06 xpconnect-sample.html

./program:
total 16K
d---------+ 1 frinux None    0 Jan 15 21:28 .
d---------+ 1 frinux None    0 Jan 15 21:28 ..
----------+ 1 frinux None 2.7K Jan 15 21:07 Makefile.in
----------+ 1 frinux None 4.5K Jan 15 21:07 nsTestSample.cpp

Here is the makefile I made :

CXX   = c++
CPPFLAGS +=     -fno-rtti              \
        -fno-exceptions        \
        -shared  

# Change this to point at your Gecko SDK directory. 
GECKO_SDK_PATH = /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1

# GCC only define which allows us to not have to #include mozilla-config 
# in every .cpp file.  If your not using GCC remove this line and add 
# #include "mozilla-config.h" to each of your .cpp files. 
GECKO_CONFIG_INCLUDE = -include mozilla-config.h 

GECKO_DEFINES  = -DXPCOM_GLUE -DXP_WIN

GECKO_INCLUDES = -I $(GECKO_SDK_PATH)/include 

GECKO_LDFLAGS =  -L $(GECKO_SDK_PATH)/lib -lxpcomglue \
                 -lnspr4      \
                 -lplds4      

FILES = nsSample.cpp nsSampleModule.cpp 

TARGET = sample.dll

build: 
    $(CXX) -Wall -Os -o $(TARGET) $(GECKO_CONFIG_INCLUDE) $(GECKO_DEFINES) $(GECKO_INCLUDES) $(GECKO_LDFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(FILES)
    chmod +x $(TARGET)
    strip $(TARGET)

clean: 
    rm $(TARGET)

I'm trying to build it with cygwin under Windows (with gcc & g++ installed).

When compiling, I'm getting thos errors, and after some hours of research, I still don't understand them:

$ make
c++ -Wall -Os -o greenfox.dll -include mozilla-config.h  -DXPCOM_GLUE -DXP_WIN -I /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include  -L /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/lib -lxpcomglue  -lnspr4       -lplds4       -fno-rtti               -fno-exceptions         -shared    nsSample.cpp nsSampleModule.cpp
In file included from nsSample.cpp:48:
nsSample.h:44:23: nsISample.h: No such file or directory
In file included from nsSample.cpp:48:
nsSample.h:64: error: expected class-name before '{' token
nsSample.h:76: error: `NS_DECL_ISUPPORTS' does not name a type
In file included from /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsAlgorithm.h:43,
                 from /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsTArray.h:45,
                 from /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsStringAPI.h:56,
                 from /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsEmbedString.h:43,
                 from nsSample.cpp:51:
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCharTraits.h:143: error: an explicit specialization must be preceded by 'template <>'
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCharTraits.h:433: error: an explicit specialization must be preceded by 'template <>'
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCharTraits.h:727: error: an explicit specialization must be preceded by 'template <>'
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCharTraits.h:763: error: an explicit specialization must be preceded by 'template <>'
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCharTraits.h:828: error: an explicit specialization must be preceded by 'template <>'
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCharTraits.h:840: error: an explicit specialization must be preceded by 'template <>'
nsSample.cpp:61: error: no `nsSampleImpl::~nsSampleImpl()' member function declared in class `nsSampleImpl'
nsSample.cpp:81: error: no `nsrefcnt nsSampleImpl::AddRef()' member function declared in class `nsSampleImpl'
nsSample.cpp: In member function `nsrefcnt nsSampleImpl::AddRef()':
nsSample.cpp:81: error: `mRefCnt' undeclared (first use this function)
nsSample.cpp:81: error: (Each undeclared identifier is reported only once for each function it appears in.)
nsSample.cpp: At global scope:
nsSample.cpp:81: error: no `nsrefcnt nsSampleImpl::Release()' member function declared in class `nsSampleImpl'
nsSample.cpp: In member function `nsrefcnt nsSampleImpl::Release()':
nsSample.cpp:81: error: `mRefCnt' undeclared (first use this function)
nsSample.cpp: At global scope:
nsSample.cpp:81: error: no `nsresult nsSampleImpl::QueryInterface(const nsIID&, void**)' member function declared in class `nsSampleImpl'
nsSample.cpp: In member function `nsresult nsSampleImpl::QueryInterface(const nsIID&, void**)':
nsSample.cpp:81: error: `::nsISample' has not been declared
nsSample.cpp:81: error: `COMTypeInfo' undeclared (first use this function)
nsSample.cpp:81: error: expected primary-expression before "int"
nsSample.cpp:81: error: expected `)' before "int"
nsSample.cpp:81: error: expected `)' before ';' token
nsSample.cpp:81: error: `nsISample' has not been declared
nsSample.cpp:81: error: expected `>' before '*' token
nsSample.cpp:81: error: expected `(' before '*' token
nsSample.cpp:81: error: expected primary-expression before '>' token
nsSample.cpp:81: error: expected `)' before ';' token
nsSample.cpp: In function `nsresult nsSampleImpl_GetInterfacesHelper(PRUint32*, nsIID***)':
nsSample.cpp:81: error: `::nsISample' has not been declared
nsSample.cpp:81: error: `COMTypeInfo' undeclared (first use this function)
nsSample.cpp:81: error: expected primary-expression before '*' token
nsSample.cpp:81: error: expected primary-expression before ')' token
nsSample.cpp:81: error: expected `;'
nsSample.cpp: At global scope:
nsSample.cpp:89: error: no `nsresult nsSampleImpl::GetValue(char**)' member function declared in class `nsSampleImpl'
nsSample.cpp:120: error: no `nsresult nsSampleImpl::SetValue(const char*)' member function declared in class `nsSampleImpl'
nsSample.cpp:141: error: no `nsresult nsSampleImpl::Poke(const char*)' member function declared in class `nsSampleImpl'
nsSample.cpp: In member function `nsresult nsSampleImpl::Poke(const char*)':
nsSample.cpp:142: error: `SetValue' undeclared (first use this function)
nsSample.cpp: At global scope:
nsSample.cpp:153: error: no `nsresult nsSampleImpl::WriteValue(const char*)' member function declared in class `nsSampleImpl'
In file included from /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/mozilla/Module.h:44,
                 from /cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/mozilla/ModuleUtils.h:42,
                 from nsSampleModule.cpp:39:
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCOMPtr.h:895: error: an explicit specialization must be preceded by 'template <>'
/cygdrive/c/dev/greenchallenge/xulrunner-sdk-9.0.1/include/nsCOMPtr.h:1366: error: an explicit specialization must be preceded by 'template <>'
In file included from nsSampleModule.cpp:42:
nsSample.h:44:23: nsISample.h: No such file or directory
In file included from nsSampleModule.cpp:42:
nsSample.h:64: error: expected class-name before '{' token
nsSample.h:125: error: ISO C++ forbids declaration of `NS_DECL_NSISAMPLE' with no type
nsSample.h:125: error: expected `;' before "private"
Makefile:27: recipe for target `build' failed
make: *** [build] Error 1

It is as if there was errors in the Mozilla code... What am i doing wrong ?

Thanks !

Was it helpful?

Solution 2

Wladimir was right on one point: nsISample.h was lacking in the compilation.

However, creating this file will not resolve the main problem: Mozilla XPCOM cannot be compiled with GCC for Windows!

The same code under VisualC++ express will compile.

This is weird, I wonder why they chose this compiler. Don't do like me, don't try GCC to compile Mozilla XPCOM!

OTHER TIPS

The important error seems to be this one, the rest looks like follow-up errors:

nsSample.h:44:23: nsISample.h: No such file or directory

That file needs to be created at build time from nsISample.idl using the xpidl command line tool:

xpidl -m header nsISample.idl

Apparently, in newer XULRunner SDK versions you would use pyxpidl instead:

header.py -o nsISample.h nsISample.idl

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top