linux - 交叉编译时如何正确链接生成文件中的共享对象(.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/OtherlibSrcDirectory
bar.cpp
bar.h
foolib.h
bar.cpp
任何帮助将不胜感激!
解决方案
发现我的错误。
libfoo.so 已经在目标计算机上,并且位于正确的文件夹 (/lib) 中。我的程序能够毫无问题地找到它。
我的错误:我在没有 root 权限的情况下在目标机器上执行了我的程序。没有 root 权限,我不能初始化 Foolib。
sudo ./prog
修复了一切。
推荐阅读
- python - 如何使用 xpath 和 Robotframework 在 div 中定位标签名称
- android - Lint 修复 UClass 中的添加方法
- python - 属性错误:获取会话
- machine-learning - 如何更改 sklearn 中任何学习算法的训练阈值?
- r - 找出每个 id 是否有任何非 NA 值
- angular - 使用 switchMap 和 forkJoin 时合并结果
- sql - 检测和填充 PostgreSQL 街道地址数据中的缺失数据
- google-cloud-platform - 将谷歌云服务帐户与群组电子邮件连接时出现问题
- c++ - vscode cpp 代码格式化程序使双 Guillemet 像这样对齐 >>
- oracle-apex - 过滤后 Jquery 选择器(输入:复选框)在动态操作中不起作用