C/C++ 编译器如何在缺乏依赖库(只有头文件)的情况下正确编译?

2020-02-24 10:57:09 +08:00
 alphaprogrammer

一份代码需要编译到几种不同的平台, 依赖一些第三方库,因为没有编译环境,只能采用交叉编译的方式, 有没有方法能解决这种问题?

目前我知道的是通过 dlopen 的方式来处理,但是对代码改动较大,大家有什么其他更好的方法吗?

4556 次点击
所在节点    C++
31 条回复
alphaprogrammer
2020-02-24 12:38:14 +08:00
@hitmanx 目前在这方面尝试,dlopen 之类的壳代码不知道有没有什么方法能自动生成的
alphaprogrammer
2020-02-24 12:39:06 +08:00
@ysc3839 -_-!! 对 window 不了解,没接触过。
SPACELAN
2020-02-24 12:39:12 +08:00
@alphaprogrammer #19 静态兼容性好很多,也方便别人直接运行
neighbads
2020-02-24 12:41:12 +08:00
接口不多的话 写个假的 lib,只有导出函数没有功能的。。
ysc3839
2020-02-24 13:39:50 +08:00
@alphaprogrammer https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
帮你找到了,Linux 也有这个功能,而且 gcc 可以直接识别 .so 文件,不像 Windows 需要一个 stub lib。
chinuno
2020-02-24 13:58:40 +08:00
系统的包管理器不是这样用的。。
那上面的库是为了维护系统内的依赖用的。你要用上面的库应该目标系统上安装 dev 包在目标系统上编译才能用这些库。
另外一种用到包管理器里面库的情况是源维护者自己编译软件包的时候用到,一般也是维护者交叉编译对应库链接过去的。
自己另外编译还强行用这些库很容易依赖被破坏。包管理器安装的软件一般没出问题是因为有维护者一直在更新依赖,就算是这样有时候还是会出现依赖问题。
如果你只是要在对应系统发布可执行程序,最好的做法是每个平台编译对应的静态库,发布的时候发布静态连接的可执行程序。如果需要源码发布就附带每个平台的静态库一起发布。
augustheart
2020-02-24 15:05:56 +08:00
@alphaprogrammer 甚至平台不同也会碰到问题的。每个平台的实现可能不同。基本上来说就是靠运气编程
FrankHB
2020-02-25 14:47:55 +08:00
@SPACELAN 静态链接兼容性一样要看节操,谁给你保证更好的。
更没法变通才是真的。
另外 Win32 上嘛,静态库里糊个 main 进去还可能让链接器找不到入口……
FrankHB
2020-02-25 14:53:46 +08:00
Ubuntu 用的第三方库,本来就没给你打算交叉编译来用。问题是你自己搞不到源码直接自己编译?
退一步讲,就这些库的节操……真用,跑个虚拟机搞个环境都比你搞交叉编译省事。
SPACELAN
2020-02-25 14:53:53 +08:00
@FrankHB #28 参考 Golang
alphaprogrammer
2020-02-26 13:03:18 +08:00
说一下情况,就是原本写的代码时基于 x86 的,现在需要在 arm 上跑,依赖于一些第三方库(在目标机上可以直接 apt 安装)。目前由于没有 arm 环境,只能在 x86 上使用交叉编译的方式编译出 arm 可执行程序,第三方库依赖采用 dlopen 的方式去除依赖。(如果能下载 arm 版的第三方库 binary,也可以直接编译的)

目前我的实现方式有点取巧,个人感觉实现方式不太好。

首先,之前实现的代码都定义在一个 namespace A 下,
假定依赖一个 func_b,其类型为 type_func_b, 在 namespace A 下定义一个 type_func_b 的变量 func_b,变量名与函数名相同,通过__attribute__(constructor)初始化 func_b 变量,指向第三方库中的函数符号。

这样以前的代码基本不需要改,只需要根据编译 include 一个头文件即可。
有一个缺点就是必须定义在同一个 namespace 下,否则变量 func_b 会与第三方库中的函数声明冲突

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX