linux下开发的程序如何编译成静态文件,就是放在其他环境,即使环境没有安装依赖的动态库,也能运行

左右的右手 2014-07-29 04:49:20
linux下开发的程序,依赖libssl.so libpthread.so libsqlite3.so等库,现在把程序放在另外一个环境运行,发现缺少这些库,现在要求不允许在这个环境上安装这些库,那么只有把程序修改为静态链接,问题是,如何编写Makefile
例如有多个c++类,类A,B,C,文件D
类A依赖libssl.so,类B依赖libpthread.so,类C依赖 libsqlite3.so,D是主函数,依赖前面三个类文件,现在要求最后生成的执行程序在其他环境也能运行
...全文
232 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
luotuo44 2014-07-30
  • 打赏
  • 举报
回复
引用 9 楼 wangdongdong198910 的回复:
[quote=引用 8 楼 wangdongdong198910 的回复:] [quote=引用 6 楼 luotuo44 的回复:] [quote=引用 5 楼 wangdongdong198910 的回复:] [quote=引用 4 楼 wangdongdong198910 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] 1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???[/quote] 我现在把so等动态库考到运行环境的程序所在目录,然后更改Makefile文件中的链接路径/usr/lib/为当前路径./,这样并不行,运行程序时,依然报libsqlite3.so等库找不到,这里你说的发布所需要的共享库指的是什么意思呢?[/quote] 链接时和运行时都是要查找so文件的。你只是为链接指定了so文件的路径。运行时并没有。所以在运行时还是会报错[/quote] 能不能举个例子,比如说,现在程序依赖libssl.so ,那我在发布程序时,或者编译程序时应该怎么做,才能在任何linux系统上运行,运行环境不用安装该库也能运行?[/quote] 已解决,需要修改环境变量export LD_LIBRARY_PATH=".":$LD_LIBRARY_PATH[/quote] 最好不要把当前目录.放到LD_LIBRARY_PATH变量中。你可以新建一个目录,把这个目录的路径放到LD_LIBRARY_PATH变量中。然后把so文件放到这个目录上。 当然,如果你有root权限的话,可以直接把so文件放到/usr/lib目录下。这种方法不用修改LD_LIBRARY_PATH变量。不过这种方法不是很好。
左右的右手 2014-07-30
  • 打赏
  • 举报
回复
引用 8 楼 wangdongdong198910 的回复:
[quote=引用 6 楼 luotuo44 的回复:] [quote=引用 5 楼 wangdongdong198910 的回复:] [quote=引用 4 楼 wangdongdong198910 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] 1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???[/quote] 我现在把so等动态库考到运行环境的程序所在目录,然后更改Makefile文件中的链接路径/usr/lib/为当前路径./,这样并不行,运行程序时,依然报libsqlite3.so等库找不到,这里你说的发布所需要的共享库指的是什么意思呢?[/quote] 链接时和运行时都是要查找so文件的。你只是为链接指定了so文件的路径。运行时并没有。所以在运行时还是会报错[/quote] 能不能举个例子,比如说,现在程序依赖libssl.so ,那我在发布程序时,或者编译程序时应该怎么做,才能在任何linux系统上运行,运行环境不用安装该库也能运行?[/quote] 已解决,需要修改环境变量export LD_LIBRARY_PATH=".":$LD_LIBRARY_PATH
左右的右手 2014-07-30
  • 打赏
  • 举报
回复
引用 6 楼 luotuo44 的回复:
[quote=引用 5 楼 wangdongdong198910 的回复:] [quote=引用 4 楼 wangdongdong198910 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] 1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???[/quote] 我现在把so等动态库考到运行环境的程序所在目录,然后更改Makefile文件中的链接路径/usr/lib/为当前路径./,这样并不行,运行程序时,依然报libsqlite3.so等库找不到,这里你说的发布所需要的共享库指的是什么意思呢?[/quote] 链接时和运行时都是要查找so文件的。你只是为链接指定了so文件的路径。运行时并没有。所以在运行时还是会报错[/quote] 能不能举个例子,比如说,现在程序依赖libssl.so ,那我在发布程序时,或者编译程序时应该怎么做,才能在任何linux系统上运行,运行环境不用安装该库也能运行?
左右的右手 2014-07-30
  • 打赏
  • 举报
回复
引用 5 楼 wangdongdong198910 的回复:
[quote=引用 4 楼 wangdongdong198910 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] 1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???[/quote] 我现在把so等动态库考到运行环境的程序所在目录,然后更改Makefile文件中的链接路径/usr/lib/为当前路径./,这样并不行,运行程序时,依然报libsqlite3.so等库找不到,这里你说的发布所需要的共享库指的是什么意思呢?[/quote] 能不能举个例子,比如说,现在程序依赖libssl.so ,那我在发布程序时,或者编译程序时应该怎么做,才能在任何linux系统上运行,运行环境不用安装该库也能运行?
luotuo44 2014-07-29
  • 打赏
  • 举报
回复
引用 5 楼 wangdongdong198910 的回复:
[quote=引用 4 楼 wangdongdong198910 的回复:] [quote=引用 2 楼 dbzhang800 的回复:] 1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???[/quote] 我现在把so等动态库考到运行环境的程序所在目录,然后更改Makefile文件中的链接路径/usr/lib/为当前路径./,这样并不行,运行程序时,依然报libsqlite3.so等库找不到,这里你说的发布所需要的共享库指的是什么意思呢?[/quote] 链接时和运行时都是要查找so文件的。你只是为链接指定了so文件的路径。运行时并没有。所以在运行时还是会报错
左右的右手 2014-07-29
  • 打赏
  • 举报
回复
引用 4 楼 wangdongdong198910 的回复:
[quote=引用 2 楼 dbzhang800 的回复:] 1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???[/quote] 我现在把so等动态库考到运行环境的程序所在目录,然后更改Makefile文件中的链接路径/usr/lib/为当前路径./,这样并不行,运行程序时,依然报libsqlite3.so等库找不到,这里你说的发布所需要的共享库指的是什么意思呢?
左右的右手 2014-07-29
  • 打赏
  • 举报
回复
引用 2 楼 dbzhang800 的回复:
1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
你的意思是直接把动态链接库一起发布???
左右的右手 2014-07-29
  • 打赏
  • 举报
回复
引用 2 楼 dbzhang800 的回复:
1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
您好!感谢你的回答,我现在是用的静态库,但是报以下错误 libcrypto.a(fips.o): In function `FIPSCHECK_verify': (.text+0xa0b): undefined reference to `dlopen' libcrypto.a(fips.o): In function `FIPSCHECK_verify': (.text+0xa1f): undefined reference to `dlsym' libcrypto.a(fips.o): In function `FIPSCHECK_verify': (.text+0xa37): undefined reference to `dladdr' libcrypto.a(fips.o): In function `FIPSCHECK_verify': (.text+0xa43): undefined reference to `dlclose' libcrypto.a(fips.o): In function `FIPSCHECK_verify': (.text+0xa95): undefined reference to `dlclose' libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': (.text+0x1b4): undefined reference to `dlsym' libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': (.text+0x299): undefined reference to `dlerror' libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': (.text+0x334): undefined reference to `dlsym' libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': (.text+0x419): undefined reference to `dlerror' libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload': (.text+0x495): undefined reference to `dlclose' libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': (.text+0x594): undefined reference to `dlopen' libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': (.text+0x60a): undefined reference to `dlclose' libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': (.text+0x641): undefined reference to `dlerror' libsqlite3.a(sqlite3.o): In function `unixDlError': /root/sqlite-autoconf-3070500/sqlite3.c:27947: undefined reference to `dlerror' libsqlite3.a(sqlite3.o): In function `unixDlSym': /root/sqlite-autoconf-3070500/sqlite3.c:27974: undefined reference to `dlsym' libsqlite3.a(sqlite3.o): In function `unixDlClose': /root/sqlite-autoconf-3070500/sqlite3.c:27978: undefined reference to `dlclose' libsqlite3.a(sqlite3.o): In function `unixDlOpen': /root/sqlite-autoconf-3070500/sqlite3.c:27933: undefined reference to `dlopen' collect2: ld returned 1 exit status make: *** [authServer] Error 1
dbzhang800 2014-07-29
  • 打赏
  • 举报
回复
1. 按你所说,如果你要静态链接的话,你就不能使用 libssl.so/libpthread.so这些共享库。你必须使用与之对应的静态库。 2. 发布程序,也没必要静态链接,你只要把所需要的共享库一块发布不就行了?
左右的右手 2014-07-29
  • 打赏
  • 举报
回复
自己顶下,求大神帮助

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧