C ++,无法从so库访问包含的头文件

时间:2018-06-16 20:03:40

标签: c++ makefile g++ shared-libraries

我尝试在test.cpp文件中包含我自己构建的.so库。 当我尝试制作test.cpp文件时,我得到了这个例外:

root@airdrop:/home/pi/naza-interface/examples# make
g++ -c test.cpp
test.cpp:31:35: fatal error: naza_interface_manual.h: No such file or 
directory
#include "naza_interface_manual.h"
                               ^
compilation terminated.
Makefile:5: recipe for target 'test.o' failed
make: *** [test.o] Error 1

test.cpp的Makefile看起来像这样:

output: test.o
            g++ -L. -lnazainterface -o test test.o

test.o:
            g++ -c test.cpp

clean:
            rm -f *.o

test.cpp只包含库。

#include "naza_interface_manual.h"

该库包含两个文件naza_interface_manual.hnaza_interface_manual.cpp。库的makefile看起来像这样:

libso: naza_interface_manual.o pca9685.o
            g++ -fPIC -L/usr/local/lib -shared naza_interface_manual.o 
            pca9685.o -lbcm2835 -o libnazainterface.so

naza_interface_manual.o: src/naza_interface_manual.cpp src/naza_interface_manual.h
            g++ -fPIC -c -Wall src/naza_interface_manual.cpp

pca9685.o: src/PCA9685/pca9685.cpp src/PCA9685/pca9685.h
            g++ -c src/PCA9685/pca9685.cpp

install: naza_interface_manual.o pca9685.o
            g++ -L/usr/local/lib naza_interface_manual.o pca9685.o -lbcm2835 - 
shared -o /usr/local/libnazainterface.so

clean:
            rm *.o output

naza_interface_manual.h:

#ifndef NAZA_INTERFACE_MANUAL_H_
#define NAZA_INTERFACE_MANUAL_H_


class naza_interface_manual_c{
    public:
            naza_interface_manual_c();

            // A: For roll control (left/right)
            // E: For pitch control (front/back)
            // T: For throttle control
            // R: For rudder control
            // U: For Control Model Switch
            void configure_pins(int A, int E, int T, int R, int U);

            void fly_forward(int speed);
            void fly_backward(int speed);
            void fly_up(int speed);
            void fly_down(int speed);
            void fly_left(int speed);
            void fly_right(int speed);

 };


 #endif

naza_interface_manual.cpp:

#include <iostream>
#include <wiringPi.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

#include "naza_interface_manual.h"
#include "PCA9685/pca9685.h"

naza_interface_manual_c::naza_interface_manual_c(){

    std::cout << "Starting Naza Interface";

}

void naza_interface_manual_c::configure_pins(int A, int E, int T, int R, int U){
    PCA9685 pca9685;

    pca9685.SetFrequency(100);

    pca9685.Write(CHANNEL(0), VALUE(350));
}
void naza_interface_manual_c::fly_forward(int speed){

}
void naza_interface_manual_c::fly_backward(int speed){

}
void naza_interface_manual_c::fly_up(int speed){

}
void naza_interface_manual_c::fly_down(int speed){

}
void naza_interface_manual_c::fly_left(int speed){

}
void naza_interface_manual_c::fly_right(int speed){

}

2 个答案:

答案 0 :(得分:3)

您的Makefile没有安装头文件。实际上,它还将共享对象安装在非标准位置:/usr/local。您希望该库进入/usr/local/lib并且您需要在/usr/local/include中安装头文件。

您的Makefile与传统规则不一致:您没有all规则,您直接在安装目录中创建库,而不是调用/ usr / bin / install。 ..我建议你研究一下&#34;适当的&#34; Makefile布局,如果要分发它。用户希望你给他们的Makefiles提供很多东西;有事实上的标准要遵循。

如果您想使用库而不安装,则需要在test.o:目标中为编译器提供相关的include指令;类似于-Ipath/to/your/header

答案 1 :(得分:0)

您的编译没有为编译器提供查找标题的包含路径。

而是指定基本位置并添加编译路径。否则,如果您可以更改naza接口库,则其install目标应将标头安装到系统(或$PREFIX/include)位置。

test.o:
            g++ -I$(NAZA_INTERFACE_LIB)/src/ -c test.cpp