首页 > 解决方案 > 交叉编译时如何正确链接生成文件中的共享对象(.so 文件)?

问题描述

我在 openSuse 平台上有一些 C++ 代码,我需要对其进行编译才能在不同的基于 linux 的目标上执行。部分代码是动态库libfoo.so。我编译所有内容,make然后将编译后的可执行文件prog与目标一起复制libfoo.so。然后当我运行可执行文件时,我收到一些错误,表明 libfoo 无法初始化。我已经尝试了所有我能找到的方法来告诉可执行文件它在哪里可以找到,libfoo.so但我仍然得到错误。

谁能告诉我我在这里做错了什么?我觉得这可能是Makefile中的错误。

我对 C++ 非常陌生,并且通常使用 Makefile,最重要的是,目标运行的是一种专有的 linux 版本,所以我无法提供太多关于它的信息。不过,我确实有合适的编译器。

我在openSuse平台上的目录结构:

|src
|--Foolib
|----foolib.h
|----libfoo.so
|--Otherlib
|----otherlib.h
|----otherlib.hpp
|---+OtherlibSrcDirectory
|--bar.cpp
|--bar.h
|--Makefile

目标上的目录结构:

|program
|--libfoo.so
|--prog

我的制作文件:

LIBS = -LFoolib -lfoo
INC = -I OtherLib -I Foolib
CXXFLAGS += -lpthread -std=c++11 -D_GLIBCXX_USE_NANOSLEEP $(INC)
LDFLAGS = '-Wl,-rpath,$$ORIGIN'
SRC_FILES = bar.cpp
OBJ =  $(SRC_FILES:%.cpp=%.o)

prog: $(OBJ)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBS) -o $@ $^

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

基本上,bar.h包括Foolib/foolib.h和包括。然后调用一些函数,它们返回错误值。如有必要,我可以提供对代码的更多见解,但我暂时将其省略以使其更短一些。Otherlib/OtherlibSrcDirectorybar.cppbar.hfoolib.hbar.cpp

任何帮助将不胜感激!

标签: linuxc++11makefileshared-librariescross-compiling

解决方案


发现我的错误。

libfoo.so 已经在目标计算机上,并且位于正确的文件夹 (/lib) 中。我的程序能够毫无问题地找到它。

我的错误:我在没有 root 权限的情况下在目标机器上执行了我的程序。没有 root 权限,我不能初始化 Foolib。

sudo ./prog修复了一切。


推荐阅读