Связывание библиотеки C ++ - PullRequest
       56

Связывание библиотеки C ++

2 голосов
/ 03 февраля 2020

Я пытаюсь связать проект с внешним проектом (с именем Prog). Я не использую проблему с большими проектами и зависимостями, я впервые сталкиваюсь с такой проблемой при связывании другой библиотеки.

Я хочу включить эту библиотеку как stati c или лучше, как динамику c библиотека для MyProject. Компиляция Prog дает мне stati c библиотеки (".a"), я включил их в мой "basi c" Makefile, вот его изображение:

Makefile :

CXX = g++
SRCS = $(shell find . -name "*.cpp")
OBJS = $(addsuffix .o, $(basename $(SRCS))
EXEC = test
CXXFLAGS += -std=c++17 -O3 

LIBS = -L/usr/include/lib -lprogvcore \
       -lpthread -lz -lm


CXXFLAGS += -I/usr/local/include/code \
            -std=c++11 -O3


all : $(EXEC)

$(EXEC): $(OBJS) 
    @$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)


%.o: %.cpp 
    @$(CXX) -o $@ -c $< $(CXXFLAGS) $(LIBS)

.PHONY: clean mrproper

clean:
        @rm -f $(OBJS)

mrproper: clean
        @rm -rf $(EXEC)

Вот картинка иерархии проекта:

MyProject
|
|
|------ TESTMain.cpp
|
|------ TESTFILES_THAT_USE_PROG_FUNCTIONS
|                    |
|                    |------ MC 
|                    |             |
|                    |             |------- PROG.cpp
|                    |             |------- PROG.h 
|
|------ PROG-Project
|
|------ Makefile

Когда я запускаю, компилятор распознает заголовки файлов PROG, но когда я хочу использовать функции PROG, он возвращает:

MC/PROG.o : In function « PROG::createModel(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) » :
/home/git/test/test-src/MC/PROG.cpp:37 : underfined reference to « PROGCore_init_data() »
/home/git/test/test-src/MC/PROG.cpp:41 : underfined reference to « PROGCore_init(PROGEnv_TAG*, void (* (*) [2])(PROGEnv_TAG*), int) »
collect2: error: ld returned 1 exit status
Makefile:46: recipe for target 'test' failed
make: *** [test] Error 1

Я пытался создать динамическую библиотеку c, чтобы избежать проблемы с упорядочением библиотек, но она не работала.

Извините, мой engli sh, но я надеюсь, что моя проблема была ясна.

Спасибо вы.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Переменная LIBS неверна, она должна быть LDFLAGS. Во-вторых, везде вы передаете флаг -stati c, что не имеет смысла, если вы пытаетесь создать библиотеку stati c, если нет, я предлагаю удалить ее, поскольку это не Инструкция, как написано для компоновщика, как написано. Кроме того, вы не делаете ссылки при компиляции .o из. cpp 's

также настоятельно рекомендуем при определении SR C и OB JS использовать': = 'вместо' = ', поэтому что они определены один раз и не переоцениваются каждый раз, когда вы их упоминаете.

0 голосов
/ 03 февраля 2020

Неопределенная ссылка указывает, что компоновщик не может найти библиотеку, ищите libnusmvcore в ./nusmv/NuSMV/build. Будьте осторожны с относительным путем, возможно, измените его на абсолютный путь, чтобы убедиться, что компоновщик смотрит в правильном месте.

...