我正在使用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,它在这类项目中运行得很好,只是这个项目是一个更大的项目的一部分,他们使用makefile来完成所有的工作。所以我想主要的问题是makefile,当我列出源代码时,它可能不喜欢它。。。
有什么建议吗?
提前谢谢你。
编辑。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
所以我的整个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;
}
最佳答案
好吧,首先。。。在项目中包含您自己的标题时,我建议您使用"mine.hpp"
而不是<mine.hpp>
。这样可以确保编译器不会搜索完整的包含路径,也不会意外地找到其他同名包含(例如不同版本)。
其次,当类中有依赖项时,则在该类中包含该依赖项的头。您不能假设有人将您的所有依赖项包含在主类或其他类中。有时有人只想自己用你的课。你不想让他们知道你的依赖关系。不要担心复制,因为include guard(或pragma
)会阻止复制。
至于你的特殊问题,你需要使用你的代码。在这一点上,您确实成功地正确地包含了头文件。我想他们可能是因为某个地方失踪了。看看你的第一个错误并解决它。
编辑
问题似乎在于如何使用boost。我在operators.hpp和version 1_44中看到的是一个带有4个模板参数的结构定义,其中一个参数默认为{
。我唯一能说的就是确保你的整个boost库都在你的include路径和link路径上。
编辑2
从你新发布的代码中我看到了一些问题。首先,你的标题中包含的内容太多了。您应该只在头文件中包含类依赖项,并且总是希望将头文件放入实现(.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循环周围放置大括号(这是为了清晰和安全。。。明白你为什么把它放在一条线上,但这是不值得的)。还要把你的导师放在第一位:
#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;
}
您需要的唯一依赖项是
;
。老实说,我很确定你也不需要。无论如何,我建议您从上面开始,然后通过一次添加一个依赖项来建立。关于c++ - 将boost与自己的 header 和源代码链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24260230/