Невозможно вызвать функцию SO-файла из SO-файла - make-файл C ++ - PullRequest
0 голосов
/ 21 января 2020

Каталог моего проекта выглядит следующим образом:

  • libs
  • bin
  • FooProj
    • makefile
    • foo. h
    • foo. cpp
  • BarProj
    • makefile
    • bar.h
    • bar. cpp
  • MainProj
    • makefile
    • main. cpp
  • makefile

FooProj и BarProj - это shared-библиотеки проектов (скомпилированных в файлы so).

Проблема в том, что когда bar. cpp вызывает функцию из foo.h ( который находится в другой разделяемой библиотеке) Я получил ошибку компиляции на main. cpp, которая говорит о неопределенной ссылке на foo ().

g++ -std=c++14 -rdynamic -g -I../FooProj/ -I../BarProj/ -L../libs/ main.cpp -o ../bins/run -lFooProj -lBarProj
../libs//libBarProj.so: undefined reference to `foo()'
collect2: error: ld returned 1 exit status
makefile:5: recipe for target 'all' failed
make[1]: *** [all] Error 1
make[1]: Leaving directory '/builds/test/MainProj'
makefile:2: recipe for target 'all' failed
make: *** [all] Error 2

Вот мои закодированные файлы:

//foo.h
#ifndef _FOO_
#define _FOO_
void foo();
#endif

//foo.cpp
#include "foo.h"
#include <iostream>
void foo() { std::cout << "foo" << std::endl; }

make-файл FooProj

SHELL = /bin/sh
CXX = g++
CXXFLAGS = -std=c++14 -rdynamic -fPIC -g
LDFLAGS = -shared

TARGET  = ../libs/libFooProj.so
SOURCES = $(shell echo *.cpp)
HEADERS = $(shell echo *.h)
OBJECTS = $(SOURCES:.cpp=.o)

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all: $(TARGET)

$(TARGET): $(OBJECTS) $(HEADERS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS)

.

//bar.h
#ifndef _BAR_
#define _BAR_
void bar();
#endif

//bar.cpp
#include "bar.h"
#include "foo.h"
#include <iostream>
void bar()
{
    std::cout << "bar" << std::endl;
    std::cout << "call foo function:" << std::endl;
    foo();
}

make-файл BarProj

SHELL = /bin/sh
CXX = g++
CXXFLAGS = -std=c++14 -rdynamic -pthread -fPIC -g -L../libs/ -lFooProj -I../FooProj/
LDFLAGS = -shared

TARGET  = ../libs/libBarProj.so
SOURCES = $(shell echo *.cpp)
HEADERS = $(shell echo *.h)
OBJECTS = $(SOURCES:.cpp=.o)

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all: $(TARGET)

$(TARGET): $(OBJECTS) $(HEADERS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS)

main. cpp

#include "bar.h"
int main()
{
    bar();
    return 0;
}

make-файл MainProj:

#include "bar.h"
int main()
{
    bar();
    return 0;
}

make-файл всего проекта:

all:
    $(MAKE) all -C FooProj/
    $(MAKE) all -C BarProj/
    $(MAKE) all -C MainProj/

Что я должен сделать, чтобы решить эту проблему? Я не понимаю, почему моя разделяемая библиотека BarProj не может вызвать функцию из FooProj.

1 Ответ

0 голосов
/ 21 января 2020

Проблема была в make-файле BarProj. Я удалил -lFooProj из CXXFLAGS и поместил его здесь в конце строки:

$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS)

Это решило проблему.

Полный make-файл BarProj:

SHELL = /bin/sh
CXX = g++
CXXFLAGS = -std=c++14 -rdynamic -pthread -fPIC -g -L../libs/ -I../FooProj/
LDFLAGS = -shared

TARGET  = ../libs/libBarProj.so
SOURCES = $(shell echo *.cpp)
HEADERS = $(shell echo *.h)
OBJECTS = $(SOURCES:.cpp=.o)

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all: $(TARGET)

$(TARGET): $(OBJECTS) $(HEADERS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS) -lFooProj
...