Tag: 链接器

静态链接glibc但是其他一些库与GCC动态链接

我需要静态链接glibc到我的项目,因为目标平台只支持一个非常旧的(但它与我的工具链中的静态链接glibc一起使用,我已经检查过了) 不幸的是,这个应用程序必须使用pthread库,但静态链接的libpthread需要占用太多空间。 我想静态链接glibc,并动态pthread。 运行此命令后 powerpc-unknown-linux-gnu-gcc object_files -lrt -lpthread -Wl,-Bstatic -lc 我明白了: /powerpc-unknown-linux-gnu/bin/ld: cannot find -lgcc_s

如何在C99多文件项目中声明内联函数?

我想在项目中定义一个内联函数,用c99编译。 我该怎么做? 当我在头文件中声明该函数并在.c文件中提供详细信息时,其他文件无法识别该定义。 当我将显式函数放在头文件中时,我遇到了问题,因为使用它的所有.o文件都有定义的副本,因此链接器给出了“多重定义”错误。 我想要做的是: header.h inline void func() { do things… } lib1.c #include “header.h” … lib2.c #include “header.h” 使用lib1.o和lib2.o的实用程序

查询gcc的-ffunction-section和-fdata-sections选项

以下在GCC页面中提到的function部分和数据部分选项: -ffunction-sections -fdata-sections 如果目标支持任意节,则将每个函数或数据项放入输出文件中的自己的部分。 函数名称或数据项名称确定输出文件中节的名称。 在链接器可以执行优化以改善指令空间中引用的局部性的系统上使用这些选项。 大多数使用ELF对象格式的系统和运行Solaris 2的SPARC处理器都具有这种优化的链接器。 AIX可能会在将来进行这些优化。 只有在这样做的重大好处时才使用这些选项。 指定这些选项时,汇编器和链接器将创建更大的对象和可执行文件,并且速度也会更慢。 如果指定此选项,则无法在所有系统上使用gprof,如果同时指定此选项和-g,则可能在调试时遇到问题。 我的印象是这些选项有助于减少可执行文件的大小。 为什么这个页面会说它会创建更大的可执行文件? 我错过了什么吗?

C在不同文件中定义的相同全局变量

我正在这里阅读这段代码 (中文)。 有一段关于在C中测试全局变量的代码。变量a已经在文件中定义了两次。 在文件foo.c定义了一个带有一些值和一个main函数的struct b 。 在main.c文件中,定义了两个没有初始化的变量。 /* th */ #ifndef _H_ #define _H_ int a; #endif /* foo.c */ #include #include “th” struct { char a; int b; } b = { 2, 4 }; int main(); void foo() { printf(“foo:\t(&a)=0x%08x\n\t(&b)=0x%08x\n \tsizeof(b)=%d\n\tb.a=%d\n\tb.b=%d\n\tmain:0x%08x\n”, &a, &b, sizeof b, ba, bb, main); } /* main.c */ #include […]

你能静态编译一个cygwin应用程序吗?

cygwin是否允许静态编译的二进制文件? 这样可以防止cygwin1.dll出现在目标机器的PATH上。

C头文件和编译/链接

我知道头文件具有各种函数,结构等的前向声明,这些函数,结构等在.c文件中用于“调用” #include ,对吗? 据我了解,“权力分立”的情况如下: 头文件: func.h 包含函数的前向声明 int func(int i); C源文件: func.c 包含实际的函数定义 #include “func.h” int func(int i) { return ++i ; } C源文件source.c (“实际”程序): #include #include “func.h” int main(void) { int res = func(3); printf(“%i”, res); } 我的问题是:看到#include只是一个编译器指令,它在.h所在的文件中复制.h的内容, .c文件如何知道如何实际执行该函数? 所有它得到的是int func(int i); 那么它怎么能实际执行这个function呢? 它如何获得func的实际定义? 标题是否包含某种“指针”,表示“那是我的定义,在那边!”? 它是如何工作的?

初始化标头中的静态变量

我是C语言编程的新手,所以我尝试了许多不同的东西来尝试并熟悉语言。 我写了以下内容: 文件q7a.h : static int err_code = 3; void printErrCode(void); 文件q7a.c : #include #include “q7a.h” void printErrCode(void) { printf (“%d\n”, err_code); } 文件q7main.c : #include “q7a.h” int main(void) { err_code = 5; printErrCode(); return 0; } 然后我在makefile中运行以下命令(我使用的是Linux操作系统) gcc –Wall –c q7a.c –o q7a.o gcc –Wall –c q7main.c –o q7main.o gcc q7main.o q7a.o –o q7 […]

数学库中的文字常量与变量

所以,我知道在C你需要将代码链接到数学库libm ,以便能够使用它的函数。 今天,当我试图向朋友certificate这一点,并解释你为什么需要这样做时,我遇到了以下我不理解的情况。 请考虑以下代码: #include #include /* #define VARIABLE */ int main(void) { #ifdef VARIABLE double a = 2.0; double b = sqrt(a); printf(“b = %lf\n”,b); #else double b = sqrt(2.0); printf(“b = %lf\n”,b); #endif return 0; } 如果定义了VARIABLE则需要按照通常的预期链接libm ; 否则你得到通常的main.c:(.text+0x29): undefined reference to sqrt链接错误的main.c:(.text+0x29): undefined reference to sqrt表明编译器找不到函数sqrt的定义。 我很惊讶地看到,如果我评论#define VARIABLE ,代码运行正常,结果是正确的! 为什么在使用变量时我需要链接到libm但是在使用文字常量时我不需要这样做? 当库没有链接时,编译器如何找到sqrt的定义? 我在linux下使用gcc […]

编译程序中的多个C文件

我有以下两个文件: 在file1.c int main(){ foo(); return 0; } file2.c中 void foo(){ } 我可以file1.c两个文件一起编译和链接,这样file1.c将识别foo函数而不添加extern吗? 更新了原型。 gcc file1.c file2.c throws:warning:函数foo的隐式声明。

头文件中的变量定义

我对C和编译过程的基本知识最近变得生疏。 我试图找出以下问题的答案,但我无法连接编译,链接和预处理阶段基础知识。 快速搜索谷歌也没有多大帮助。 所以,我决定来到最终的知识来源:) 我知道:不应该在.h文件中定义变量。 可以在那里宣布它们。 原因:因为头文件可能包含在多个位置,因此重新定义变量多次(链接器给出错误)。 可能的解决方法:在头文件中使用header-guard并在其中定义变量。 它真的是一个解决方案:不。因为标题保护是用于预处理阶段。 那就是告诉编译器这部分已经包含在内并且不再包含它。 但是我们的多重定义错误出现在链接器部分 – 在编译之后。 整件事让我对预处理和链接的工作方式感到困惑。 如果已经定义了头部保护符号,我认为预处理将不包括代码。 在那种情况下,不应该解决变量问题的多重定义吗? 这些预处理指令会在标题保护下重新定义编码过程,但链接器仍会获得符号的多个定义,会发生什么?