【问题标题】:How do I correctly link a shared object (.so file) in a makefile when cross-compiling?交叉编译时如何正确链接生成文件中的共享对象(.so 文件)?
【发布时间】:2020-11-04 03:05:51
【问题描述】:

我在 openSuse 平台上有一些 C++ 代码,我需要对其进行编译才能在不同的基于 linux 的目标上执行。部分代码是动态库libfoo.so。我用make 编译所有内容,然后将编译后的可执行文件proglibfoo.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

我的 Makefile:

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.cpp 包括bar.h。然后在bar.cpp 中调用来自foolib.h 的一些函数,它们返回错误值。如有必要,我可以提供对代码的更多见解,但我暂时将其省略以使其更短一些。

任何帮助将不胜感激!

【问题讨论】:

  • 我认为您需要提供 MVCE - 一系列重现您的问题的 shell 命令。不要忘记提供“一些错误表明无法初始化 libfoo”并扩展“我已经尝试了所有我能找到的方法来告诉可执行文件在哪里可以找到 libfoo.so”。
  • 感谢@yugr 的建议。关于错误:所有 libfoo 函数都返回错误值。如果为 0,则没有错误。我总是得到一个错误值,在文档中解释为“无法初始化 Libfoo。”。 “我已经尝试了所有我能找到的东西......”我的意思是我试图调整 rpath 和 LD_LIBRARY_PATH 来告诉可执行文件它可以在哪里找到 .so。我还尝试将 .so 放入可执行文件的目录以及 /lib 中。由于目标的专有操作系统,我不确定是否可以提供 MVCE,但我会试一试...
  • "Libfoo 无法初始化" - AFAIK 这不是 Glibc 发出的标准错误消息,因此很可能某些特定于 libfoo 的启动逻辑会失败。
  • @yugr 我认为你是对的。我尝试在目标系统上使用 libfoo shell 命令,这应该可以正常工作,因为它与我的代码完全无关,但我收到一条错误消息“无法设置 Libfoo”。我将不得不查看目标系统的配置。

标签: linux c++11 makefile shared-libraries cross-compiling


【解决方案1】:

发现我的错误。

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

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

sudo ./prog 修复了所有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多