Скомпилируйте *. cpp и *. c с помощью Automake - PullRequest
0 голосов
/ 16 июня 2020

Структура:

-myProject
    -Makefile.am
    -configure.ac
    -src
        -Makefile.am
        -main.c
        -test.c
        -test.h

Когда я пытаюсь скомпилировать, у меня появляется ошибка Неопределенная ссылка на функцию из теста. c.

Makefile.am:

   AUTOMAKE_OPTIONS = foreign
   SUBDIRS=src

src / Makefile.am:

   bin_PROGRAMS = TEST
   AM_CXXFLAGS =-Wall -Wno-psabi -w -pthread -I/usr/local/include
   AM_CFLAGS =-Wall -w
   #Sources
   TEST_SOURCES = test.c main.cpp
   TEST_LDADD = @LDFLAGS@ -lmosquitto
   TEST_LDFLAGS =-lmosquitto 

Кажется, что невозможно связать два источника. Кто-нибудь может мне помочь ??

ОШИБКА:

make  all-recursive
make[1]: Entering directory '/media/sf_Shared/Software/executables/TEST'
Making all in src
make[2]: Entering directory '/media/sf_Shared/Software/executables/TEST/src'
g++ -DHAVE_CONFIG_H -I. -I..    -Wall -Wno-psabi -w -pthread -I/usr/local/include -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
mv -f .deps/main.Tpo .deps/main.Po
g++ -Wall -Wno-psabi -w -pthread -I/usr/local/include  -g -O2 -lmosquitto   -o TEST test.o main.o -lmosquitto 
/usr/bin/ld: main.o: in function `main':
/media/sf_Shared/Software/executables/TEST/src/main.cpp:564: undefined reference to `open_ports(unsigned int, unsigned int)'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:366: TEST] Error 1
make[2]: Leaving directory '/media/sf_Shared/Software/executables/TEST/src'
make[1]: *** [Makefile:359: all-recursive] Error 1
make[1]: Leaving directory '/media/sf_Shared/Software/executables/TEST'
make: *** [Makefile:300: all] Error 2

Я включаю в основной. cpp test.h. Объявлена ​​функция open_ports (u_int32_t open_ports (u_int32_t a, u_int32_t b);), которая реализована в test. c

1 Ответ

0 голосов
/ 16 июня 2020

Это не проблема automake - вы делаете правильные вещи (или, по крайней мере, близки) к Makefile.am.

Проблема в том, что ваш символ объявлен без extern "C", но определен только в C, поэтому, когда компилятор C ++ берет ваш main.cpp, он ожидает найти искаженные символы (которые кодируют сигнатуру функции, то есть количество и типы параметров) , а не простой (C).

Вы можете сказать, что это так, потому что он ищет open_ports(unsigned int, unsigned int), а не просто open_ports.

Самое простое решение состоит в том, чтобы изменить ваш main.cpp, чтобы он говорил:

extern "C" {
#include "test.h"
}

Это заявляет, что заголовок test.h включает только C объявления, которые затем будут генерировать правильный поиск символов для того, что вы определяете в test.c .

...