我尝试在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.h
和naza_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){
}
答案 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