Tag: 静态链接

c静态链接到lib并仍然请求DLL

使用visual studio 2008,我有一个.H和一个库的.LIB文件。 我编写了一个程序并通过项目属性修改了LIB。 它编译得很好,但是当它运行时,它要求安装DLL。 如果DLL与EXE在同一个目录中它可以工作……但是,如果我有LIB,是不是已经意味着这些函数与我的程序静态链接? 谢谢

如何从C调用用C ++编写的lib?

在我看来,这似乎是一个明智的选择,但我找不到任何反对或为此的信息。 从demangling等的角度来看,我不认为这是一个大问题,但我无法弄清楚,我怎么能写一个小C程序从一个小小的C ++库调用一个函数。 我现在在linux上,尝试使用静态绑定。 这一定是许多人遇到的问题,或许多书籍所涵盖的内容,但我觉得这个问题就像一个盲目的傻瓜。 有趣的是,SO也没有这样的问题。 我甚至不知道如果这可以工作,那么必须如何做得更少。

C – 包含依赖项的编译

我有一些代码,我想在一台我没有root权限的机器上运行。 该机器没有运行此代码所需的一些库。 在编译时有没有办法包含所有依赖项? 我意识到结果文件可能非常大。

C运行时静态与动态链接中的内存分配

我的程序架构涉及插件(dll)和exe(显然)。 我们是唯一的插件提供商。 有人告诉我,如果我们静态链接c运行时,在插件中分配内存然后在exe代码中释放它是一个潜在的问题。 但是,如果我们动态链接它,那么只有一个堆,并且c运行时可以访问所有这些堆。 我们根据这个建议切换到动态链接,但是我们从交换机看到的所有内容都是令人头疼的问题,以及与新运行时的分发和安装相关的麻烦。 (不知道我们在内存分配问题上避免了什么。) 内存分配的含义是什么? 假设一个插件分配内存,exe释放它。 静态与动态链接的c运行时之间是否存在不同的行为? 如果我们使用插件,我们是否会在静态链接c运行时时遇到问题? 如果我们切换回静态链接,那会破坏内存泄漏检测和崩溃转储报告吗? 与我选择哪个VC ++运行时版本的注释提出的一些问题一致- 静态还是动态? 具体来说,我选择哪个VC ++运行时版本 – 静态还是动态? 在http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx上也有一些讨论。

在C中,是否可以将导出的函数名称更改为不同的名称?

所有。 我想链接一个调用malloc()函数的库。 但是,我的目标环境是不同的, malloc()作为内联函数提供。 如何使库对malloc()的调用直接指向我的目标环境的malloc()例程? 是否可以通过任何方式更改导出的函数名称? 如果是这样,我可以先编码my_malloc()并将其导出为malloc()并将库链接到该库: #include // malloc() is inline function declared there void my_malloc (void) { malloc (void); } 更具体地说,该库是来自linux发行版的库,因此它依赖于libc。 但我的环境是嵌入式的,没有libc库, malloc() , free() ,…是自定义实现的。 一些是内联函数,一些是库函数。

我可以静态链接MSVCRT和mingw吗?

我有C程序我在Windows上用mingw编译。 它工作正常,但需要MSVCRT.DLL 。 我想静态链接(就像我在Visual Studio中可以做的那样)。 这可能吗? 我尝试了-static标志到gcc ,它没有做任何改变。 使用标准C ++库的C ++程序怎么样?

C库未使用gcc / g ++进行链接

我有一个我在gcc中使用的c库。 该库具有扩展名.lib,但始终链接为静态库。 如果我编写一个使用该库作为c代码的程序,那么一切都可以。 但是,如果我将文件重命名为.cpp(在c / c ++中执行简单的操作),我会得到未定义的引用。 这些是我为测试目的编写的简单小程序,所以没有花哨的东西。 我编译使用: gcc -g -Wall -I -o program main.c customlibrary.lib -lm -lpthread 以上作品就像一个魅力。 然而: g++ -g -Wall -I -o program main.cpp customlibrary.lib -lm -lpthread 要么 gcc -g -Wall -I -o program main.cpp customlibrary.lib -lm -lpthread -lstdc++ 导致对customlibrary.lib中任何函数的未定义引用。 我尝试创建一个名为customlibrary.a的符号链接,但没有运气。 为什么g ++不会识别我的库。 不幸的是我无法访问库的源代码,但是将c-lib链接到c ++应该不是问题吧?

如何创建静态链接共享库

对于我的硕士论文,我正在尝试为ARM Cortex-M3嵌入式系统调整共享库方法。 由于我们的目标板没有MMU,我认为使用“普通”动态共享库是没有意义的。 因为.text是直接从flash执行的,并且.data在启动时被复制到RAM,所以我无法解决相对于代码的.data,因此GOT也是如此。 必须通过必须在链接时定义的绝对地址来访问GOT。 那么为什么不在链接时为所​​有符号分配固定的绝对地址……? 从“链接器和加载器”一书中我了解到“静态链接共享库,即库中程序和数据地址在链接时绑定到可执行文件的库”。 链接的章节描述了如何创建这样的库,并提供对Unix System V,BSD / OS的引用; 还提到了Linux和它的uselib()系统调用。 不幸的是,本书没有提供如何实际创建诸如工具和/或编译器/链接器开关之类的库的信息。 除了那本书之外,我几乎没有找到任何关于这些“野外”图书馆的信息。 我在这方面唯一发现的是Linux的预链接 。 但是,由于这是在“正常”动态库上运行,而不是我正在寻找的。 我担心这些库的使用非常具体,因此不存在创建它们的常用工具。 虽然在这种情况下提到的uselib()系统调用让我感到疑惑。 但是我想确保在开始破解我自己的链接器之前我没有忽略任何东西……;)那么有人能给我更多关于这些库的信息吗? 此外,我想知道是否有任何gcc / ld开关链接和重定位文件,但保留文件中的重定位条目 – 以便它可以重新重新定位? 我找到了“-r”选项,但完全跳过了重定位过程。 有没有人有想法? 编辑: 是的,我也知道链接器脚本。 使用gcc libfoo.c -o libfoo -nostdlib -e initLib -Ttext 0xdeadc0de我设法得到某种链接和重定位的目标文件。 但到目前为止,我还没有找到任何可能将主程序与此链接并将其用作共享库的可能性。 (链接动态共享库的“正常方式”将被链接器拒绝。)

静态链接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

如何使用自定义版本的glibc和静态链接构建C程序?

我已经构建了glibc 2.14并将其安装在目录~/GLIBC/glibc_install 。 现在我想使用这个C库而不是系统的默认C库来构建和运行程序。 为了确保我正在使用我的自定义glibc,我添加了一个调用glibc/stdio-common/printf.c:__printf到glibc/stdio-common/printf.c:__printf来打印消息。 然后我重建并重新安装了glibc。 然后我写了一个“Hello,World”程序,并尝试编译并链接如下: gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c 但是我得到以下链接器错误报告: /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start’: (.text+0x19): undefined reference to `__libc_csu_init’ /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start’: (.text+0x25): undefined reference to `__libc_start_main’ /tmp/ccACTQEp.o: In function `main’: c1.c:(.text+0xa): undefined reference to `puts’ collect2: ld returned 1 exit status 我究竟做错了什么?