查询编译链
一般是用的GNU的那一套工具链 比如你写了一个源码为main.c 然后gcc main.c即可,生成的a,out为可执行的ELF文件。 如果你需要了解GCC的详解资料,最好读一下它的man pages
‘贰’ 关于c/c++中 编译链接的问题。
这个问题不是一两句话可以解释完
1、微软提供给我们的MFC已经编译成静态LIB和动态LIB,同时,为方便调试,微软将MFC源码(CPP文件)也放到VC里一起发布了;这里会存在两种情况,如果是静态LIB,那么功能代码会在链接时链接进你的EXE文件中,所以这种静态LIB方式时,EXE文件通常都比较大;如果是动态LIB的方式,那么运行的时候就需要mfcxxx.dll文件,但EXE文件体积比较小
2、如果你理解了1,我再进一步解释,MFC工程配置的时候默认会链接mfcxxx.lib的,所以你的工程里只需要包含对应的头文件,例如 afxxxx.h之类的文件即可,编译器在编译阶段是不需要知道具体实现代码在哪里的,它只需要知道声明即可编译通过,同时编译器会将那些外部的函数(即不是在当前CPP文件实现的函数)标记为需要修复的(我们先把它叫做修复吧);那么,假如我用了一个MFC的函数,现在我只有声明,它是怎么找到具体的实现代码呢,这就是链接器的工作了,刚才我说过,MFC工程默认是会链接mfcxxx.lib的,所以链接器在工作的时候,它会遍历所有编译过的文件,从里面找出要修复的项,然后再遍历LIB文件,如果在LIB文件里找到对应的实现,那么链接器会把编译阶段留下的手尾FIX掉
3、如果你理解了2,我们再进一步解释2;链接器链接LIB的时候,会有两种情况,第一种,这个LIB本身是一个静态LIB,包含了具体的实现;第二种,这个LIB本身只是一个中介,它是指向DLL的某个函数的;对于第一种情况,链接器会把用到的所有代码链接进去,注意,在Release版本情况下,链接器只会把用的的函数链进去,就是说,即使你的静态LIB有10MB,你也不需要担心编译出来的EXE有10MB,它只会把用到的函数链进去;;对于第二种,是指向DLL某个函数的,链接器会在EXE的PE部里的导入表部分,增加一个项,这个项指向DLL的函数,同时在修复编译阶段留下手尾的地方,让它JMP(跳转)或CALL(调用)到我们DLL函数里
以上纯属个人解释,因为在编译链接阶段是非常复杂的,一时间没办法完全解决齐,有问题可以继续追问
‘叁’ 用c语言写的并编译连接好的程序如何查看其代码
可以看到汇编代码,目前还没有工具可以直接反编译成C代码.
‘肆’ linux下如何查看.a.so文件是由什么文件编译连接
linux下如何查看.a.so文件是由什么文件编译连接
so文件就是通常说的动态链接库,就跟windows下的dll文件差不多。
ko是内核模块文件,驱动之类的啥的。
不过在linux系统下文件的后缀多数情况下只是个标识,有可能代表不了文件的真实属性的。
至于怎么编写,就跟用VS编译dll或者lib文件差不多,把你的代码编译完成以后命名为相应的后缀就好了。
我了解的一般都是C程序,java属于脚本语言,程序多数情况下是被解释执行的,所以一般不需要编译成库。至于如何编译成库文件,如果你在windows下做过开发的话应该不用我解释太多。实在不知道的话可以再问我哈~~
希望以上回答能对你有所帮助。
‘伍’ 怎么查看交叉编译工具链是glibc
在编辑工具当中我们看一下具体的连接操作方式,然后进入高级查看模式,就可以看到是否是glibc操作模式。
‘陆’ 交叉编译工具链制作的问题!
核心转储是崩溃报告的一个过程,他只是把当前崩溃的信息转存出来方便差错。而且这个核心转储几个字也不过是个提示输出信息。这个提示不会给与任何与错误相关的内容,必须看其他的错误信息或者他转储出来的东西来分析。
不过核心转储,应该是程序运行出错而崩溃。这种问题出现在你正在运行的程序,而不是编译过程出现的编译错误(也就是说,出现核心转储应该就是 GCC 或者他调用的程序自己崩溃了)。出现这个问题的原因很多。
如果是因为没有找到某些 header 文件,不应该是核心转储错误,而是编译器或者某个过程提示错误信息后退出,他会输出错误信息告诉你问题所在。
至于你编译的这些东西版本都比较老,我建议还是尝试降级整个系统来编译、运行你现在的这些东西。或者升级你这个交叉编译工具链到当前主流的版本来用。
至于交叉工具连当中的 GCC 和你当前本机的 GCC,完全是两个互相独立的 GCC 。
只是他们编译输出的二进制程序针对的指令集不同而已。相对的 binutils 和 glibc 和 kernel-header 都是一样的意思,针对目标而输出的相关程序。当然 glibc 和 kernel-header 主要是以“数据”方式存在,gcc 和 binutils 主要是以可以运行的程序方式存在(当然不是绝对的,比如 gcc 还会提供几个 lib 相关的内容,不过大部分情况下你可以这么理解更直观了解他们的作用)。
一般说来 GCC 是编译器,binutils 是连接器,glibc 是标准 C 库(主要是连接时,连接器必须有目标的函数库文件,也就是 .so 文件,对应 Windows 是 .dll 文件。连接器把函数调用正确的挂接到对应的函数入口上)。linux header 就是 C 语言常见的 C header 文件和相关的开发数据。一般主要用来编译 glibc ,glibc 作为中间层来提供内核相关调用。当然程序有些时候也会直接调用内核函数,这样这些程序在编译时也需要 kernel 的 header 。
这两套东西一个输出你当前 PC 的程序,一个输出 ARM 的程序。两个 GCC 套装之间不能互相替换。只能自己输出属于自己的程序。
但是这两套程序虽然输出的程序不同,但可以运行的部分,却都是在你的计算机上运行。而且你本机的 GCC 因为可以输出本机的程序。所以你需要用他来输出在你本机运行,但是却输出 ARM 程序的 GCC 套装。
这就好比两个锤子,一个锤子用来打铁,一个锤子用来打锡。用途不同,但这两个锤子都是铁做的。
你作这个交叉编译工具链,就是用你手里已经有的打铁的锤子,打出一个用铁制作的用来打锡的锤子。这个打锡的锤子是不能打铁的,同样这个打铁的锤子是不能用来打锡的。
‘柒’ 如何查看一个dll是用什么编译器编译的
dll文件是系统的动态链接库文件,可以用一些十六位春文本编辑器打开,如UltraEdit
修改DLL文件的方法
1、下载DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、获取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll这几个链接文件。在找这几个文件时,最好将其他机器的硬盘,挂接在本机中,然后用本机的操作系统启动并复制这几个文件。
3、在修改DLL文件的时候,打开该键值,在右面的对话框中将所要修改的键值禁用即可,不要删除,以备日后恢复
‘捌’ 怎样检查linux交叉工具链 安装成功
配置好PATH环境变量(加入你交叉编译工具链的目录),比如你arm交叉工具链,可能名字叫arm-linux-gcc。执行arm-linux-gcc -v,如果看到如上图所示提示版本信息,基本上就算安装成功了吧。GOOD LUCK~
‘玖’ 怎么查看Android编译时候交叉编译链工具位置
经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86 PC机的编译工具,可以让你在PC机上编译出目标平台(例如ARM)可识别的二进制文件。Android平台也提供了这样的交叉编译工具链,就放在Android的NDK开发包的toolchains目录下,因此,我们的Makefile文件中,只需给出相应的编译工具即可。
废话就先说到这,直接上例子,我们目标是把下面这个math.c文件编译成一个静态库文件:
#include <stdio.h>
int add( int a , int b ) {
return a+b;
}
你需要编写一个Makefile文件,这里假设你的Android ndk被安装在 /opt/android/ndk 目录下,当然,你可以根据自己的实际情况修改Makefile中相关路径的定义,Makefile文件示例如下:
# Makefile Written by ticktick
# Show how to cross-compile c/c++ code for android platform
.PHONY: clean
NDKROOT=/opt/android/ndk
PLATFORM=$(NDKROOT)/platforms/android-14/arch-arm
CROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
CFLAGS = -I$(PWD) -I$(PLATFORM)/usr/include -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
LDFLAGS =
‘拾’ 怎么查linux的交叉工具链版本
如果交叉编译工具链的路径已经添加到path变量中的话,直接使用... -v即可查看
比如我的是arm-linux-gnueabihf-g++
那么直接arm-linux-gnueabihf-g++ -v或者是--version就可以得到版本信息了。