我正在使用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/

10-16 21:31