헤더참조와 Makefile에 관한 질문 올립니다. (답변좀 꼭 달아주셨으면 감사하겠습니다.)
#include "servo.h" int main(void) { t_firmata *firmata; t_servo *servo; firmata = firmata_new("/dev/ttyACM99"); while(!firmata->isReady) firmata_pull(firmata); sleep(1); servo = servo_attach(firmata, 3); while (1) { servo->value = 45; servo_write(servo, servo->value); usleep(500 * 1000); servo->value = 135; servo_write(servo, servo->value); usleep(500 * 1000); } }
이소스와 opencv facedetect 소스를 병합&수정하여 페이스 트래킹을 해보려고 하는데
아직 초보라 모르는게 많아서 대충 위치에 걸맞게 병합하여
Makefile을 이용해 make를 하게되면 에러가나서 질문을 올렸습니다
처음에는 sleep함수와 usleep함수가 was not declared in this scope 에러가 나타납니다
그래서 이 두함수를 주석처리 해봤는데
servo.cpp:(.text+0x6a): undefined reference to `firmata_new(char*)'
servo.cpp:(.text+0x82): undefined reference to `firmata_pull(s_firmata*)'
servo.cpp:(.text+0xa7): undefined reference to `servo_attach(s_firmata*, int)'
servo.cpp:(.text+0x65f): undefined reference to `servo_write(s_servo*, int)'
servo.cpp:(.text+0x688): undefined reference to `servo_write(s_servo*, int)'
collect2: error: ld returned 1 exit status
이런 오류가 뜨더라고요 링크가 안되는거같은데
페이스디텍트소스와 servo를 따로 돌리게되면 문제가 없는데 합치면 이렇습니다
페이스디텍트는 g++ -o facedetect facedetect.cpp `pkg-config --libs \opencv`
서보소스는 make파일로
all:
>>서보 원래메이크파일 gcc -L.. -I../includes servoTest.c -lfirmatac -o servotest.ex
gcc u3_shield_GPIO_sysfs.c -o extGPIO.ex
>>병합한 서보파일 g++ -L.. -I../includes servo.cpp -lfirmatac -o servo.ex `pkg-config --libs \opencv`
clean:
rm *.ex
re: clean all
distclean: clean
이런식으로 되있고 병합한 서보파일 make문구는 제가 그냥 합쳐본것입니다.
app에 참조되는 라이브러리가 하나 더 있고 Makefile도 있는데
program_NAME := firmatac program_C_SRCS := $(wildcard src/*.c) program_C_OBJS := ${program_C_SRCS:.c=.o} program_OBJS := $(program_C_OBJS) program_INCLUDE_DIRS := includes program_LIBRARY_DIRS := program_LIBRARIES := CC = gcc CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) .PHONY: all clean distclean all: $(program_NAME) ar rc libfirmatac.a $(program_OBJS) $(program_NAME): $(program_OBJS) # $(CC) $(program_OBJS) -o $(program_NAME) clean: @- $(RM) libfirmatac.a @- $(RM) $(program_NAME) @- $(RM) $(program_OBJS) re: clean all distclean: clean
이런구성으로 되있습니다.
공부하고 있지만 아직 지식이 많이부족해서 그런데 도와주시면 감사하겠습니다.
C언어로 만든 함수를 C++언어에서
C언어로 만든 함수를 C++언어에서 사용하려면
extern "C" {
//여기에 C함수 선언들...
}
이런식으로 선언될 필요가 있습니다.
보통 헤더파일에 이렇게 적어둡니다만, C컴파일러를 위해
#ifdef _cplusplus
extern "C" {
#endif
//여기에 C 함수 선언...
#ifdef _cplusplus
}
#endif
이런식으로 C 헤더파일이 수정되어야 합니다.
간단하게는,
C++ 소스!! 파일에서 C헤더파일을 인클루드할때
extern "C" { ... } 로 감싸주면 됩니다.
감사합니다
감사합니다 ㅎㅎ
댓글 달기