【问题标题】:Can't call function of SO file from an SO file - C++ makefile无法从 SO 文件调用 SO 文件的函数 - C++ makefile
【发布时间】:2020-05-07 07:41:50
【问题描述】:

我的项目目录是这样的:

  • 垃圾箱
  • FooProj
    • 制作文件
    • foo.h
    • foo.cpp
  • 酒吧项目
    • 制作文件
    • bar.h
    • bar.cpp
  • 主项目
    • 制作文件
    • main.cpp
  • 制作文件

FooProj 和 BarProj 是 shared-libraries 项目(编译为 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; }

FooProj的makefile

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();
}

BarProj 的makefile

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;
}

MainProj 的makefile:

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

整个项目的makefile:

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

我应该怎么做才能解决这个问题?我不明白为什么我的 BarProj 共享库无法从 FooProj 调用函数。

【问题讨论】:

  • 实际上,它对我有用。您在描述中错过了 MainProj 的 Makefile,但无论如何来自 log 的命令都可以完成它的工作。可能,您以前的构建失败了?尝试清理项目目录。

标签: c++ makefile shared-libraries


【解决方案1】:

问题出在 BarProj 的 makefile 上。 我从 CXXFLAGS 中删除了 -lFooProj 并将其放在行尾:

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

这解决了问题。

完整的 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

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多