3

我正在尝试构建此处可用的 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 代码中有错误......我做错了什么?

谢谢 !

4

2 回答 2

2

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

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

该文件需要在构建时nsISample.idl使用xpidl命令行工具创建:

xpidl -m 头文件 nsISample.idl

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

header.py -o nsISample.h nsISample.idl

于 2012-01-16T06:45:40.107 回答
1

Wladimir 有一点是对的:编译中缺少 nsISample.h。

然而,创建这个文件并不能解决主要问题:Mozilla XPCOM 不能用 GCC for Windows 编译!

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

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

于 2012-01-19T10:46:06.013 回答