构建XPCOM Mozilla示例组件

时间:2012-01-15 20:33:07

标签: c++ compiler-errors mozilla xpcom xpi

我正在尝试构建可用的XPCOM组件: http://mxr.mozilla.org/mozilla-central/source/xpcom/sample/

我尝试使用自己的Makefile编译它,以便可以从整个Mozilla源中隔离此组件。

所以这是我的文件树:

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

这是我制作的makefile:

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)

我正在尝试使用Windows下的cygwin构建它(安装了gcc& g ++)。

编译时,我遇到了错误,经过几个小时的研究后,我仍然不理解它们:

$ 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

好像Mozilla代码中有错误......我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

重要的错误似乎是这一点,其余的看起来像后续错误:

  

nsSample.h:44:23:nsISample.h:没有这样的文件或目录

需要使用xpidl command line toolnsISample.idl的构建时创建该文件:

  

xpidl -m header nsISample.idl

显然,在较新的XULRunner SDK版本中,您可以使用pyxpidl代替:

  

header.py -o nsISample.h nsISample.idl

答案 1 :(得分:1)

弗拉基米尔的观点是对的:nsISample.h在编辑中缺乏。

但是,创建此文件无法解决主要问题:无法使用GCC for Windows编译Mozilla XPCOM!

VisualC ++ express下的相同代码将编译。

这很奇怪,我想知道他们为什么选择这个编译器。不要像我一样,不要尝试GCC编译Mozilla XPCOM!