Неопределенная ссылка на функцию.Линкер не может найти внешние функции "C" в моей общей библиотеке - PullRequest
0 голосов
/ 12 апреля 2019

Извиняюсь заранее.Это первый проект, где я должен написать свой собственный MakeFile, и он грязный.Любые указатели будут с благодарностью.

Цель: я хочу создать ссылку на общую библиотеку, которая содержит внешние функции "C".Не все элементы в библиотеке объявлены внутри внешнего «C», только одна функция.

Я могу успешно связаться с общей библиотекой и вызывать не внешние элементы "C".Однако, когда мне нужно вызвать эти внешние функции "C", ld возвращает неопределенную ссылку.

Вот соответствующие части моего make-файла

CC = gcc
CFLAGS = -lstdc++ -std=c++11 -Wall -c
LFLAGS = -lstdc++ -Wall
INCLUDE = -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util
OBJS = TimeService.o main.o
LIB = -L /usr/lib64

all : $(OBJS)
    $(CC) -o $@ $(OBJS) $(INCLUDE) $(LIB) $(LFLAGS) -o main -luciapi1.3

TimeService.o : TimeService.cpp TimeService.h
    $(CC) $(INCLUDE) TimeService.cpp $(CFLAGS)

main.o : main.cpp TimeService.h
    $(CC) $(INCLUDE) main.cpp $(CFLAGS)

Этот сборник даст мне все, что мне нужно, что не включено в extern "C" {}

Iпытался включить заголовочный файл как так:

extern "C" {
    #include "fileIneed.h" //Did not help
}

И это не имело значения.

Я просто не понимаю, почему я могу поразить все в этой библиотеке, которое не заключено во внешнюю букву "C".

Спасибо за помощь.

Редактировать

Я прочитал отличный пост ( Объединение C ++ и C - как работает #ifdef__cplusplus work? ) разъяснение того, что делает extern c, но теперь я больше не понимаю, почему это не работает.

Я прочитал, что порядок имеет значение при компиляции, но мой -llib последним.

Вот ошибка компа, если это поможет.

$ gcc -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util TimeService.cpp -lstdc++ -std=c++11 -Wall -c

$ gcc -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util main.cpp -lstdc++ -std=c++11 -Wall -c

$ gcc -o all ../util/util/otherclass1.o otherclass2.o TimeService.o main.o -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util -L /usr/lib64 -lstdc++ -Wall -o TimeServiceLauncher  -luciapi1.3
TimeService.o: In function `TimeService::TimeService()':
TimeService.cpp:(.text+0x19a): undefined reference to `fucntionIwantReallyBad'
TimeService.cpp:(.text+0x1f4): undefined reference to `otherFunctionThatIWantInSameSituation'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

Редактировать 2

Я пытался включить файл двумя различными способами, но ни один из них не получился:

#ifdef __cplusplus
extern "C" {
#endif
    #include "uci/base/AbstractServiceBusConnection.h"
#ifdef_cplusplus
}
#endif

и

#ifdef __cplusplus
extern "C" {
    #include "uci/base/AbstractServiceBusConnection.h"
}
#endif

Вот как функция объявлена ​​в библиотеке.

#ifdef __cplusplus
extern "C" {
#endif

    EXPORT location::in::library* function(param1, param2) throw(exception);

#ifdef __cplusplus
}
#endif

Я попробую с g ++, но я не уверен, что это изменит.Я обновлю, если это произойдет.

Я начинаю думать, что не знаю, как вызывать функцию?
Я должен просто иметь возможность вызывать функцию в классе .cpp, для которого я включил файл .h.

Мне не нужно идти

location::of::file.function //or location::of::file::function, correct?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...