关于编译执行文件遇到的问题小结
2015-06-24 07:24
369 查看
在利用别处拷贝过来的makefile进行编译,编译成功后在服务器上运行程序,但出现如下错误:
而发现makefile中的编译器命令为如下所示:
这里的编译器是关于arm-hisi的编译环境,编译出来的程序是需要在hisi的板子上跑的,所以接下来将执行程序挂载到板子上跑,这是原因之一。
在板子上跑时还是会出现上面的错误,觉得需要从makefile中入手,但由于自己对makefile不了解,考虑到时间紧急的原因,仅仅对相应的makefile进行了部分的了解。一下链接让我对该部分的makefile有了初步认识性的了解:
编译makefile的部分认识
接下来认识了静态编译与动态编译的内容,具体链接如下:
静态编译与动态编译相关
后来知道编译成一个库容易,只要有相关的头文件,即有相应函数的声明就可以了,但如果要生成可执行文件则需要将相应的库链接到执行文件中,这过程中需要了解编译时的相关命令,下面是比较常用的一些编译命令,这里链接库主要用到”-I”(包含的头文件路径),”-L”(链接的库路径),”-l”(链接的库,不包含库的”lib”字符和后面的”.so”或”.a”字符):
编译时比较常用的编译命令
同时在编译执行文件时加了-static就不能连接.so了,只能连接.a库,所以如果你要将一个特定的动态.so库链接进执行程序中,一般会将其他需要链接到的库也换成动态库。
在修改了之后又遇到一大片的错误,如下图所示:
经后来分析发现由于所用到的库是用c++编写的,而我再编译执行文件时用的是GCC,所以导致了这一系列的错误。这里不用管上层自己编写的程序是用什么编写的,只要先将上层程序生成.o文件,之后再用适合该C++库的G++进行编译即可。
这里对makefile的文件夹下全部库的包含有一个了解,一般我们可以使用“(wildcard∗.c)”来获取工作目录下的所有的.c文件列表,这里也可以通过类似的"(wildcard *.c)”来获取工作目录下的所有的.c文件列表,这里也可以通过类似的"(wildcard .c ./sub/.c)”来指定在”./sub/”目录下的所有.c文件。详细可以查看以下链接:
makefile中wildcard的使用
在完成上面的一系列纠正后,编译通过,但在挂载运行时,发现找不到执行文件,一开始以为是权限问题,但在修改了权限后还是一样。经网上搜索发现是执行程序在执行时需要链接编译时链接的那些库,所以要将那些库挂载到板子的/lib目录下。
关于执行程序使用到哪些库,可以用该命令进行查找:
arm-linux-readelf -a + 执行文件名可以查看该执行文件需要的库,详细可见如下链接:
查看执行文件需要用到的库
最后遗漏了一个程序中动态库的链接和调用方法,如下链接:
动态库的使用
而发现makefile中的编译器命令为如下所示:
这里的编译器是关于arm-hisi的编译环境,编译出来的程序是需要在hisi的板子上跑的,所以接下来将执行程序挂载到板子上跑,这是原因之一。
在板子上跑时还是会出现上面的错误,觉得需要从makefile中入手,但由于自己对makefile不了解,考虑到时间紧急的原因,仅仅对相应的makefile进行了部分的了解。一下链接让我对该部分的makefile有了初步认识性的了解:
编译makefile的部分认识
接下来认识了静态编译与动态编译的内容,具体链接如下:
静态编译与动态编译相关
后来知道编译成一个库容易,只要有相关的头文件,即有相应函数的声明就可以了,但如果要生成可执行文件则需要将相应的库链接到执行文件中,这过程中需要了解编译时的相关命令,下面是比较常用的一些编译命令,这里链接库主要用到”-I”(包含的头文件路径),”-L”(链接的库路径),”-l”(链接的库,不包含库的”lib”字符和后面的”.so”或”.a”字符):
编译时比较常用的编译命令
同时在编译执行文件时加了-static就不能连接.so了,只能连接.a库,所以如果你要将一个特定的动态.so库链接进执行程序中,一般会将其他需要链接到的库也换成动态库。
在修改了之后又遇到一大片的错误,如下图所示:
经后来分析发现由于所用到的库是用c++编写的,而我再编译执行文件时用的是GCC,所以导致了这一系列的错误。这里不用管上层自己编写的程序是用什么编写的,只要先将上层程序生成.o文件,之后再用适合该C++库的G++进行编译即可。
这里对makefile的文件夹下全部库的包含有一个了解,一般我们可以使用“(wildcard∗.c)”来获取工作目录下的所有的.c文件列表,这里也可以通过类似的"(wildcard *.c)”来获取工作目录下的所有的.c文件列表,这里也可以通过类似的"(wildcard .c ./sub/.c)”来指定在”./sub/”目录下的所有.c文件。详细可以查看以下链接:
makefile中wildcard的使用
在完成上面的一系列纠正后,编译通过,但在挂载运行时,发现找不到执行文件,一开始以为是权限问题,但在修改了权限后还是一样。经网上搜索发现是执行程序在执行时需要链接编译时链接的那些库,所以要将那些库挂载到板子的/lib目录下。
关于执行程序使用到哪些库,可以用该命令进行查找:
arm-linux-readelf -a + 执行文件名可以查看该执行文件需要的库,详细可见如下链接:
查看执行文件需要用到的库
最后遗漏了一个程序中动态库的链接和调用方法,如下链接:
动态库的使用
相关文章推荐
- 【面试】【Spring常见问题总结】【06】
- Java中的split函数的用法
- 【面试】【Spring常见问题总结】【05】
- 保存不同类型的函数到map
- 【面试】【Spring常见问题总结】【04】
- 关于IE和火狐,谷歌,Safari对Html标签Object和Embed的支持问题
- 网页开发之 HTML/CSS
- Androiod开发历程(SQLite)
- Gitlab 7.12 发布 SAML支持及其他更多功能
- Android开发历程(sqlite事物、游标适配器、include标签)
- Android开发历程
- android MD5 加密算法
- iOS逆向工具Reveal使用
- ClouderaManager中Event Server报No such file or directory
- 康托尔连续统假设正确吗?
- poj 3869 Headshot 全概率公式
- Leetcode NO.208 Implement Trie (Prefix Tree)
- WSGI的理解(转载)
- Sprint8
- VMware虚拟机安装MAC OS X Mountain Lion