OSSIE是一个开源的SDR软件环境,在GitHub上目前已经更名为redhawksdr, 我从这里下载源码进行编译:
https://github.com/RedhawkSDR/redhawk/releases/download/2.0.5/redhawk-src-2.0.5-2017013.
OSSIE依赖omniORB等库,主要的两个库下载地址为:
https://nchc.dl.sourceforge.net/project/omniorb/omniORBpy/omniORBpy-4.2.2/omniORBpy-4.2.2.tar.bz2
https://nchc.dl.sourceforge.net/project/omniorb/omniORB/omniORB-4.2.2/omniORB-4.2.2.tar.bz2
在编译的时候,主要遇到两个问题,记录如下:
1. undefined reference to
make[2]: Entering directory ‘/home/ygd/redhawk-src-2.0.8/redhawk/src/control/framework’
CXXLD nodeBooter
../../base/framework/idl/.libs/libossieidl.a(libossieidl_la-cfSK.o): In functionomniCallDescriptor::omniCallDescriptor(void (*)(omniCallDescriptor*, omniServant*), char const*, unsigned long, bool, char const* const*, int, bool)':
omniCallDescriptor::sd_interceptor_call’
/usr/local/include/omniORB4/callDescriptor.h:95: undefined reference to
/usr/local/include/omniORB4/callDescriptor.h:95: undefined reference toomniCallDescriptor::sd_interceptor_call'
cdrStream::unmarshalOctet()’:
../../base/framework/idl/.libs/libossieidl.a(libossieidl_la-cfSK.o): In function
/usr/local/include/omniORB4/cdrStream.h:145: undefined reference tocdrStream::fetchAndUnmarshalOctet()'
cdrStream::fetchAndUnmarshalOctet()’
/usr/local/include/omniORB4/cdrStream.h:145: undefined reference to
/usr/local/include/omniORB4/cdrStream.h:145: undefined reference tocdrStream::fetchAndUnmarshalOctet()'
cdrStream::fetchAndUnmarshalOctet()’
/usr/local/include/omniORB4/cdrStream.h:145: undefined reference to
../../base/framework/idl/.libs/libossieidl.a(libossieidl_la-cfSK.o): In functioncdrStream::unmarshalLong()':
cdrStream::fetchAndUnmarshalLong()’
/usr/local/include/omniORB4/cdrStream.h:206: undefined reference to
/usr/local/include/omniORB4/cdrStream.h:206: undefined reference tocdrStream::fetchAndUnmarshalLong()'
cdrStream::fetchAndUnmarshalLong()’
/usr/local/include/omniORB4/cdrStream.h:206: undefined reference to
研究了一番之后,我觉得原因应该是找不到libomniORB库,可是我明明已经安装到系统/usr/local/lib中了,为什么就是找不到了。最后只能采取如下暴力解决方法:
编译omniORB-4.2.2,复制生成的libomniORB4.a静态库到redhawk-src-2.0.8/redhawk/src/base/framework/idl/libomniORB4.a, 修改makefile文件:redhawk/src/control/framework/Makefile,如下行修改,增加最后一项内容:
nodeBooter_LDADD = (BOOST_FILESYSTEM_LIB) (top_builddir)/base/framework/libossiecf.la (OMNICOS_LIBS) (top_builddir)/base/framework/idl/libomniORB4.a
这样就解决了引用无定义的问题。
2. error adding symbols: DSO missing from command line
make[2]: Entering directory ‘/home/ygd/redhawk-src-2.0.8/redhawk/src/testing/sdr/dom/components/msg_through_cpp/cpp’
CXX msg_through_cpp-msg_through_cpp.o
CXX msg_through_cpp-msg_through_cpp_base.o
CXX msg_through_cpp-main.o
CXXLD msg_through_cpp
/usr/bin/ld: msg_through_cpp-msg_through_cpp_base.o: undefined reference to symbol ‘_ZN12CosEventComm19PushSupplier_Helper7releaseEPNS_20_objref_PushSupplierE’
//usr/local/lib/libCOS4.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:503: recipe for target ‘msg_through_cpp’ failed
make[2]: * [msg_through_cpp] Error 1
make[2]: Leaving directory ‘/home/ygd/redhawk-src-2.0.8/redhawk/src/testing/sdr/dom/components/msg_through_cpp/cpp’
Makefile:631: recipe for target ‘all-recursive’ failed
make[1]: * [all-recursive] Error 1
make[1]: Leaving directory ‘/home/ygd/redhawk-src-2.0.8/redhawk/src/testing’
Makefile:600: recipe for target ‘all-recursive’ failed
make: * [all-recursive] Error 1
网上查找了一个这个错误的原因,大概意思也是说找不到库文件,于是采用同上的方法尝试一下看看:
同样复制文件到base/framework/libCOS4.a,然后修改makefile文件/home/ygd/redhawk-src-2.0.8/redhawk/src/testing/sdr/dom/components/msg_through_cpp/cpp/Makefile, 修改如下行,增加最后一项:
msg_through_cpp_LDADD = (CFDIR)/framework/idl/libossieidl.la (BOOST_LDFLAGS) (BOOST_REGEX_LIB) (INTERFACEDEPS_LIBS) (redhawk_LDADD_auto) $(CFDIR)/framework/libCOS4.a
果然又解决问题了。最后编译顺利完成。