首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从SO文件调用SO文件的函数- C++ makefile

无法从SO文件调用SO文件的函数- C++ makefile
EN

Stack Overflow用户
提问于 2020-01-21 09:24:30
回答 1查看 144关注 0票数 0

我的项目目录如下所示:

  • libs
  • bins
  • FooProj
    • makefile
    • foo.h
    • foo.cpp

  • makefile
  • bar.h
  • bar.cpp

  • BarProj BarProj

  • makefile
  • main.cpp

  • MainProj MainProj

  • makefile

shared-libraries项目(编译为so文件)是FooProj和BarProj。

问题是当bar.cpp从foo.h调用函数时(它位于一个不同的共享库中),我在main.cpp上得到了编译错误,该错误表示对foo()的未定义引用。

代码语言:javascript
复制
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

这是我的编码文件:

代码语言:javascript
复制
//foo.h
#ifndef _FOO_
#define _FOO_
void foo();
#endif

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

FooProj的生成文件

代码语言:javascript
复制
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)

代码语言:javascript
复制
//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的生成文件

代码语言:javascript
复制
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

代码语言:javascript
复制
#include "bar.h"
int main()
{
    bar();
    return 0;
}

MainProj的生成文件:

代码语言:javascript
复制
#include "bar.h"
int main()
{
    bar();
    return 0;
}

整个项目的makefile:

代码语言:javascript
复制
all:
    $(MAKE) all -C FooProj/
    $(MAKE) all -C BarProj/
    $(MAKE) all -C MainProj/

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-21 16:15:07

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

代码语言:javascript
复制
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS)

解决了问题。

完整的BarProj's makefile:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59837824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档