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

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

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

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

4837 次点击
所在节点    C++
31 条回复
fcten
2020-02-24 11:01:45 +08:00
是动态库就可以,缺少静态库则无法编译成可执行文件
shylockhg
2020-02-24 11:07:05 +08:00
交叉编译为啥会会没有库文件?
ai277014717
2020-02-24 11:18:57 +08:00
-undefined dynamic_lookup 可以符号改成动态查找。可以试试
chinuno
2020-02-24 11:19:39 +08:00
创建 stub 的 so 文件,编译的时候用 stub 链接
hitmanx
2020-02-24 11:20:10 +08:00
把 dlopen 这层逻辑封装一下,上层不需要知道调用的库函数是哪里来的。dlopen 这一层可以用代码生成
chinuno
2020-02-24 11:22:51 +08:00
第三方库你还是乖乖的交叉编译都编译出来吧
alphaprogrammer
2020-02-24 11:26:15 +08:00
@shylockhg 因为本地没有编译平台,只有一个交叉编译器
alphaprogrammer
2020-02-24 11:28:50 +08:00
@fcten 但是 gcc/g++ 在链接阶段会查找可执行程序引用到的所有函数,如果找不到会报错的吧
littlewing
2020-02-24 11:29:15 +08:00
编译不需要库,只需要头文件
链接阶段才需要库
alphaprogrammer
2020-02-24 11:29:57 +08:00
@hitmanx 目前是在这方面想,但是我希望是 动态链接的方式和 dlopen 的方式能随意切换
alphaprogrammer
2020-02-24 11:31:19 +08:00
@littlewing 这个我知道,现在就是需要编译可执行文件
alphaprogrammer
2020-02-24 11:34:37 +08:00
@chinuno 这个思路不错,之前的代码可以原封不动,不用改
alphaprogrammer
2020-02-24 11:41:55 +08:00
@ai277014717 gcc/g++ 有这个编译选项吗?
hitmanx
2020-02-24 11:42:20 +08:00
@alphaprogrammer 控制链接时要不要链接你这个 dlopen 层就可以了,拿个 build flag 控制一下
ysc3839
2020-02-24 11:47:55 +08:00
在 Windows 中可以把 DLL 等信息写入导入表中,自己的代码就不需要手动进行 LoadLibrary 等操作了。
我印象中 Linux 也有类似机制的,用这种机制就不需要自己手动 dlopen 了。
augustheart
2020-02-24 12:01:01 +08:00
要么老老实实 dlopen,要么老老实实把三方库都交叉编译一遍。
augustheart
2020-02-24 12:02:34 +08:00
你要用别的奇怪方法,就不怕碰到动态库版本不对?
SPACELAN
2020-02-24 12:15:49 +08:00
既然依赖库都要交叉编译了,不如一起静态链接吧
alphaprogrammer
2020-02-24 12:35:42 +08:00
@SPACELAN 依赖库不由我提供, 直接从特定源下载即可
alphaprogrammer
2020-02-24 12:37:04 +08:00
@augustheart 版本确实是一个问题,但是动态链接一样会碰到版本问题,这个是 code 应该做兼容处理的

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

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

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

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

© 2021 V2EX