Tag: 链接器

C编译:collect2:错误:ld返回1退出状态

我尝试在线搜索该bug,但所有post都是针对C ++的。 这是消息: test1.o:在函数ReadDictionary’: /home/johnny/Desktop/haggai/test1.c:13: undefined reference to home / johnny / Desktop / haggai / test1.c: ReadDictionary’: /home/johnny/Desktop/haggai/test1.c:13: undefined reference to CreateDictionary的ReadDictionary’: /home/johnny/Desktop/haggai/test1.c:13: undefined reference to ‘collect2:error:ld返回1退出状态make:*** [test1]错误1 超级简单的代码,无法理解是什么问题 #include #include #include #include “dict.h” #include “hash.h” pHash ReadDictionary() { /* This function reads a dictionary line by line from the standard input. */ pHash […]

将多个C源文件编译为唯一的目标文件

我有一些C源文件,我正在使用gcc 。 我基本上想要编译所有这些并创建一个单个目标文件。 当我尝试: gcc -c src1.c src2.c src3.c -o final.o 我明白了: gcc: cannot specify -o with -c or -S with multiple files 如果我尝试: gcc -c src1.c src2.c src3.c 我得到三个不同的目标文件。 如何告诉gcc编译所有文件以返回单个目标文件(我还想指定其名称)? 谢谢。 也许还有另一种更常见的方法,在这种情况下请告诉我。

有什么区别 – 1)预处理器,链接器,2)头文件,库? 我的理解是否正确?

好的,直到今天早上我才对这些术语感到困惑。 我想我有所不同,希望如此。 首先,令人困惑的是,由于预处理器已将头文件包含在包含函数的代码中,因此链接器链接到汇编器/编译器生成的目标文件的库函数是什么? 部分混淆主要是由于我对头文件和库之间的差异的无知而产生的。 经过一段谷歌搜索和堆栈溢出(就是术语?:p),我收集到头文件主要包含函数声明,而实际的实现是在另一个称为库的二进制文件中(我仍然不是100%确定这个)。 所以,假设在以下程序中: – #include int main() { printf(“whatever”); return 0; } 预处理器在代码中包含头文件的内容。 编译器/编译器+汇编器完成其工作,然后最终链接器将此目标文件与另一个实际存储了printf()工作方式的目标文件组合在一起。 我的理解是否正确? 我可能会离开……你能帮我吗? 编辑:我一直想知道C ++ STL。 它总是让我困惑的是它究竟是什么,所有这些标题的集合或什么? 在阅读完回复之后,我可以说STL是一个目标文件/类似于目标文件的东西吗? 而且,我想在哪里可以读取函数的函数定义,如pow() , sqrt()等等。我会打开头文件,但没有找到任何东西。 那么,库中的函数定义是否是二进制不可读的forms?

将共享库与静态库链接:静态库的编译方式必须与应用程序链接它的方式不同吗?

至少在Linux和Solaris上,静态库实际上只是一堆编译好的.o文件被扔进一个大文件中。 编译静态库时,通常会忽略-fpic标志,因此生成的代码与位置有关。 现在说我的静态库是B.我已经构建了它并且得到了.a文件,它实际上只是所有位置相关的.o文件的全局。 现在我有一个我想构建的共享库,A,我希望它静态链接B.当我构建A时,我自然会使用-fpic标志使生成的代码位置独立。 但是,如果我链接B,我不是混合位置依赖和位置独立的目标文件? 除非我还指定-mimpure-text,否则我会收到很多文本重定位错误,我认为这可能是原因。 看来,当我编译一个库时,我真的需要编译它3次,共享版本,静态版本和静态 – 可以使用的共享库版本。 我对吗? 我可以继续使用-mimpure-text但g ++手册页说如果你这样做,对象实际上并没有最终被共享(不清楚它是否全部未被共享,或者仅仅是静态链接的部分,有人知道吗?) 。

静态链接LAPACK

我正在尝试发布一些软件,目前正在编写构建过程的脚本。 我陷入了一些我从未想过会发生的事情,在x86_64 linux上静态链接LAPACK。 在配置期间AC_SEARCH_LIB([main],[lapack])工作,但是lapack单元的编译不起作用,例如undefiend reference to ‘dsyev_’ no lapack / blas例程的不undefiend reference to ‘dsyev_’不被注意。 我已经确认我已经安装了库,甚至自己用适当的选项编译它们,使它们具有相同的结果。 这是我几年前第一次使用LAPACK时使用的一个例子,它可以动态地工作,但不是静态工作: http : //pastebin.com/cMm3wcwF 我用来编译的两个方法如下, gcc -llapack -o eigen eigen.c gcc -static -llapack -o eigen eigen.c

编译器如何为变量分配内存地址?

我教一门课程让学生们提出有关编程的问题(!):我有这个问题: 机器为什么选择变量进入内存? 我们可以告诉它存储变量的位置吗? 我真的不知道该说些什么。 这是我的第一次尝试: 编译器(不是机器)自动选择将变量存储在进程地址空间的位置。 使用C,我们无法告诉机器存储变量的位置。 但是“自动”有点虎头蛇尾并且引发了一个问题…而且我已经意识到我甚至不知道它是编译器,运行时或操作系统还是谁来完成任务。 也许有人能比我更好地回答学生的问题。

C中的分层链接

我想以分层方式链接三个文件。 // ac int fun1(){…} int fun2(){…} // bc extern int parameter; int fun3(){…//using parameter here} // main.c int parameter = 1; int main(){…// use fun1 fun2 fun3} 所以,我首先将三个文件分别编译到目标文件ao , bo和main.o 。 然后我想将ao和bo组合成另一个目标文件tools.o 。 最后使用tools.o和main.o生成可执行文件。 但是,当我尝试将ao和bo结合起来像ld -o tools.o ao bo ,链接器会显示undefined reference to ‘parameter’ 。 我怎么能将这些目标文件链接到一个中间目标文件?

列出未使用的符号

我想从一个较大的项目中删除死代码,并希望从未使用的符号开始。 反正有没有让链接器列出它已经优化的未使用的符号? 我正在使用GNU链接器(LD)和GCC。 如果失败了,任何Binutils(readelf或objdump)都可以执行相同的function吗?

弱连接的实际应用是什么?

使用特殊编译器命令可以将符号声明为弱 。 根据维基百科 : 弱符号是对象文件或动态库中的符号定义,可以被其他符号定义覆盖 在什么场景或什么应用程序你需要弱符号? 什么是典型用例?

如何让gcc只生成可以直接加载到内存并执行的机器代码?

我想生成一个可以加载到内存中的文件(例如使用mmap ),然后跳转到该内存的开头来运行代码。 理想情况下,我希望选择使代码可重定位(可能效率低下)或指定代码期望加载的显式地址(这很痛苦),但任何一个都可能自行正常工作。