我正在使用boost库和opencv,现在我必须实现我自己的头文件和源代码(除了main.cpp之外),这也需要库。 main.cpp看起来像(原则上):
// STL includes
#include <stdlib.h>
...(some other STL stuff)
// Boost includes
#include <boost/array.hpp>
...(a lot of other boost stuff)
//OpenCV
#include <opencv2/opencv.hpp>
// Own header files
#include <myHeader.hpp>
main() do_some_stuff;
如果我在myStuff.hpp中没有与boost有关的任何内容,那么这是有效的。但是如果我在其中添加一些东西(函数描述在myStuff.cpp中),比如:
class aClass{
public:
aClass(int);
void doSomething(boost::shared_ptr<int>);
void doSomethingElse(cv::Mat);
};
然后它会显示'boost' had not been declared
或'cv' does not name a type
。
我想,好吧,我只需要在这个文件中包含标题,所以我添加了相同的包含,但是当它尝试链接时会出现很多错误,如:
/usr/include/boost/operators.hpp:308:35: error: expected identifier before numeric constant
/usr/include/boost/operators.hpp:308:35: error: expected ‘>’ before numeric constant
/usr/include/boost/operators.hpp:310:1: error: expected class-name before ‘{’ token
/usr/include/boost/operators.hpp:311:3: error: expected unqualified-id before numeric constant
...(a lot more of these errors)
我正在使用Makefile来构建这个项目,如下所示:
OPENCV_I = `pkg-config --cflags opencv`
#it finds boost without any additional -I or -L options...
INCLUDEPATHS = $(OPENCV_I)\
-I.\
-L.
LIBS=-lGL -lGLU -lm -lboost_program_options -lboost_system -lboost_thread -pthread -lrt -lopencv_core -lopencv_highgui
SRCCXX := main.cpp myStuff.cpp
OBJSCXX := $(SRCCXX:%.cpp=${BUILDDIR}/%.o)
$(BUILDDIR)/%.o : %.cpp
$(CXX) $(CXXFLAGS) $(INCLUDEPATHS) -c $< -o $@ -DdDOUBLE $(LIBS)
all: ${OBJSCXX}
$(CXX) $(LDFLAGS) $(INCLUDEPATHS) -o $(OUTNAME) $? -DdDOUBLE $(LIBS)
之前我使用的是CMake,它在这些项目中表现得非常好,只是这个项目是一个更大项目的一部分,他们使用Makefiles来处理所有事情。所以我猜主要的问题是makefile,可能在我列出我的源代码SRCCXX := main.cpp Visualisation.cpp
时它不喜欢它...
有什么建议?
提前谢谢。
EDIT ....................................
所以我的整个myStuff.hpp看起来像:
#define _USE_MATH_DEFINES
#include <math.h>
#define RINGS 5
#define SECTIONS 12
// Boost includes
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/assign/ptr_list_of.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <boost/date_time.hpp>
#include <boost/foreach.hpp>
#include <boost/function.hpp>
#include <boost/make_shared.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/program_options.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <opencv2/opencv.hpp>
class Sensor{
public:
Sensor(int);
void Update(boost::shared_ptr<char[RINGS][SECTIONS]>);
int Id();
private:
char data[RINGS][SECTIONS];
int id;
};
和myStuff.cpp:
#include "myStuff.hpp"
void Sensor::Update(boost::shared_ptr< char[RINGS][SECTIONS] > buffer){
for(int i=0;i<RINGS;i++) for(int j=0;j<SECTIONS;j++) data[i][j]=buffer[i][j];
};
Sensor::Sensor(int a){
id=0;
};
int Sensor::Id(){
return id;
};
和我的main.cpp:
// STL includes
#include <stdlib.h>
#include <iostream>
#include <mutex>
#include <string.h>
#include <typeinfo>
#include <queue>
#include <memory>
// Boost includes
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/assign/ptr_list_of.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <boost/date_time.hpp>
#include <boost/foreach.hpp>
#include <boost/function.hpp>
#include <boost/make_shared.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/program_options.hpp>
#include <boost/numeric/ublas/matrix.hpp>
//OpenCV
#include <opencv2/opencv.hpp>
// Own header files
#include "myStuff.hpp"
////////////////////////////////////////// Main
int main (int argc, char **argv)
{
Sensor sensor(0);
return 0;
}
答案 0 :(得分:1)
首先要做的事情......当您在项目中包含自己的标题时,我建议您使用"mine.hpp"
代替<mine.hpp>
。这可以确保编译器不会搜索完整的包含路径,并且意外地找到其他一些相同名称的包含(例如,不同的版本)。
其次,当您在类中具有依赖项时,则在该类中包含该依赖项的标头。您无法假设有人会将所有依赖项包含在主类或其他类中。有时候有人会想要自己使用你的课程。你不希望他们必须弄清楚你的依赖关系。不要担心复制,因为包含守卫(或pragma
)会阻止复制。
至于您的特定问题,您需要使用您的代码。您当然已设法正确包含您的标头。我猜它们可能源于某个地方遗失的{
或;
。看看你的第一个错误并解决它。
修改强>
问题似乎在于您如何使用boost。我看一下在operator.hpp和版本1_44中的内容,我看到的是一个带有4个模板参数的结构定义,其中一个默认为boost::detail::empty_base<T>
。我唯一可以说的是确保你的包含路径和链接路径上都有你的整个boost库。
<强> EDIT2 强>
从新发布的代码中我发现了一些问题。首先,你的标题包含了太多的内容。您应该只在头文件中包含类依赖项,并且始终更喜欢将头文件放入实现(.cpp)文件中。这有助于防止极长的编译时间。因此,首先修改标题以仅包含所需的依赖项:
#include <boost/shared_ptr.hpp>
#define RINGS 5
#define SECTIONS 12
class Sensor{
public:
Sensor(int);
void Update(boost::shared_ptr<char[RINGS][SECTIONS]>);
int Id();
private:
char data[RINGS][SECTIONS];
int id;
};
然后在你的实现中,唯一的变化是在你的for循环周围加上大括号(这是为了清晰和安全......理解为什么你把它放在一行但是不值得)。还要把你的CTOR放在第一位:
#include "myStuff.hpp"
Sensor::Sensor(int a){
id=0;
};
void Sensor::Update(boost::shared_ptr< char[RINGS][SECTIONS] > buffer){
for(int i=0;i<RINGS;i++) {
for(int j=0;j<SECTIONS;j++) {
data[i][j]=buffer[i][j];
}
}
};
int Sensor::Id(){
return id;
};
主要
#include "myStuff.hpp"
int main (int argc, char **argv)
{
Sensor sensor(0);
return 0;
}
您需要的唯一依赖是boost::shared_ptr
。说实话,我很确定你也不需要。无论如何,我建议您从上面开始,然后通过一次添加一个依赖项来构建。
答案 1 :(得分:0)
几个小时后,我发现了它。 myStuff.cpp还需要包含头。愚蠢的错误,但仍然为什么编译器会说像未定义的东西或者找不到几页混乱的错误......?
非常感谢你的帮助。