Tag: 链接器

由各种编译器编译的链接库

我想更详细地询问我最近在这里得到的答案(第3章): 编译语言基础知识 如果我用C和MinGW写,我链接到VC编译的C ++库 – 它会工作吗? 我怎么事先知道? 换句话说,如果我能够在没有警告的情况下创建链接到该C ++ .dll的.exe,并且我能够运行(只运行,没有进一步测试).exe,它是否意味着它有效? 在某些时候它不会被核心转储吗? 为了完全确定,我是否需要自己重新编译库源以及与之链接? 我知道有时连接C ++和C代码可能会有问题,但是如何知道它何时起作用? PS:是的,我看到使用库编译了…我只是觉得我的问题略有不同。

我怎样才能编译程序员Dvorak?

我正在尝试编译开源项目Programmer Dvorak 。 问题是它有点旧,并没有使用当前版本的构建工具构建。 您可以在我的项目的Google代码页上看到我在线修改的完整源代码。 版本2是原始项目中未修改的源文件。 修订版3是我做出所有重大更改的地方。 您可以在此处看到两个修订版之间的差异 。 剩下的唯一明显问题是一些LINK警告: LNK4254 (例如section ‘.edata’ (40000040) merged into ‘.data’ (C0000040) with different attributes. ) – 我在这里问了一个独立版本的问题。 LNK4210 (例如.CRT .CRT section exists; there may be unhandled static initializers or terminators ) 我该如何修复这些警告? 我可以忽略它们吗? 尽管有这些警告,它仍然会产生一个exe。 但是,如果我继续运行它,它将无法正确安装,我需要求助于系统还原才能再次安装正式版本。 这可能是因为警告或仅仅是因为我没有正确修改项目。 我还需要做些什么来使这个项目可以安装? 构建过程(以及对我的修改的解释): 它说您需要Windows DDK,但似乎Windows驱动程序工具包已经取代它,所以我得到了它。 我只安装了“Build Environments”。 1.根据Readme.txt ,您应该运行: build-layout && build-installer 2.运行build-layout.bat […]

Valgrind报告空C程序的未初始化值

我用gcc test.c或clang test.c编译了这个C程序: int main (void) { return 0; } valgrind ./a.out给了我这个: ==9232== Memcheck, a memory error detector ==9232== Copyright (C) 2002-2011, and GNU GPL’d, by Julian Seward et al. ==9232== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==9232== Command: ./a.out ==9232== ==9232== Conditional jump or move depends on uninitialised value(s) ==9232== […]

加载共享库时出错

我有一个项目组织为 \bin\cmain \lib\libxmlrpc_client++.a \lib\libxmlrpc_client++.so.4 \lib\libxmlrpc_client++.so.4.16 我的c程序cmain需要动态链接clib.so.4。 在编译代码时,我使用-L…/lib来表示目录lib并使用-lxmlrpc_client++ 。 但是,我的代码在加载共享库时出错: libxmlrpc_client++.so.4: cannot open shared object file: No such file or directory 有什么想法解决这个问题? PS:问题解决了,问题的一个很好的参考: http : //gcc.gnu.org/ml/gcc-help/2005-12/msg00017.html

iostream链接器错误

我有一些旧的C代码,我想与一些C ++代码结合起来。 以前的C代码包含以下内容: #include #include #include #include “mysql.h” 现在我试图让它像这样使用带有iostream的C ++: #include #include #include #include #include “mysql.h” 但是在编译时我不断收到以下链接器错误: [链接器错误]对`std :: string :: size()const’的未定义引用 [链接器错误]对`std :: string :: operator [](unsigned int)const’的未定义引用 [链接器错误]对`std :: string :: operator [](unsigned int)const’的未定义引用 [链接器错误]对`std :: string :: operator [](unsigned int)const’的未定义引用 [链接器错误]对`std :: ios_base :: Init :: Init()’的未定义引用 [链接器错误]对`std :: ios_base :: Init […]

如何在程序中包含数据对象文件(图像等)并访问符号?

我使用objcopy将几个资源文件转换为.obj文件,然后将它们与我的程序源代码链接起来。 我可以使用以下代码很好地访问程序中目标文件内的符号,但只能使用GCC / G ++(Cygwin): extern uint8_t data[] asm(“_binary_Resources_0_png_start”); extern uint8_t size[] asm(“_binary_Resources_0_png_size”); extern uint8_t end[] asm(“_binary_Resources_0_png_end”); 该代码在Visual Studio中不起作用,可能是因为VS拥有自己的__asm命令。 我希望通过链接它们将我的程序资源(图像,着色器等)包含在我的最终可执行文件的.data部分中。 但是如何在VC ++中访问目标文件中定义的符号? 我在没有汇编命令的情况下尝试了extern uint8_t _binary_Resources_0_png_start[]或extern “C” uint8_t _binary_Resources_0_png_start[] ,但是我得到了未解决的符号链接错误。

安装OpenCV并使用GCC编译C程序

作为我正在开展的更大项目的一部分,我需要在C程序上使用OpenCV库。 我在Fedora 17 32位中使用yum安装了OpenCV和opencv-devel。 我指示预处理器导入opencv / cv.h和opencv / highgui.h作为必要的头文件。 正如我所提到的,gcc用于编译整个C项目。 但是,链接器似乎存在问题。 每当我尝试编译项目( gcc opencv.c -o opencv )时,我都会得到一个错误列表,类似于: /tmp/ccLJWE0c.o: In function `cvRound’: opencv.c:(.text+0x19): undefined reference to `lrint’ /tmp/ccLJWE0c.o: In function `cvDecRefData’: opencv.c:(.text+0xa5c): undefined reference to `cvFree_’ opencv.c:(.text+0xacd): undefined reference to `cvFree_’ /tmp/ccLJWE0c.o: In function `cvGetRow’: opencv.c:(.text+0xbc3): undefined reference to `cvGetRows’ /tmp/ccLJWE0c.o: In function `cvGetCol’: opencv.c:(.text+0xbee): undefined […]

如何在MSVC中获取指向二进制部分的指针?

我正在编写一些代码,它将一些数据结构存储在一个特殊的命名二进制部分中。 这些是同一结构的所有实例,它们分散在许多C文件中,并且不在彼此的范围内。 通过将它们全部放在命名区域中,我可以遍历所有这些区域。 在GCC中,我使用_ attribute _((section(…))加上一些特别命名的extern指针,这些指针由链接器神奇地填充。这是一个简单的例子: #include extern int __start___mysection[]; extern int __stop___mysection[]; static int x __attribute__((section(“__mysection”))) = 4; static int y __attribute__((section(“__mysection”))) = 10; static int z __attribute__((section(“__mysection”))) = 22; #define SECTION_SIZE(sect) \ ((size_t)((__stop_##sect – __start_##sect))) int main(void) { size_t sz = SECTION_SIZE(__mysection); int i; printf(“Section size is %u\n”, sz); for (i=0; i < […]

静态编译共享库

我有一个带有一些自制函数的共享库,我将其编译到我的其他程序中,但是我必须将结束程序与我用来编译静态库的所有库相关联。 这是一个例子: 我在库中有函数foo ,它需要来自另一个库libbar.so的函数。 在我使用函数foo主程序中,我必须用-lbar标志编译它。 有没有办法可以静态编译我的库,所以它包含了其他库中的所有必需代码,我可以编译我的结束程序而不需要-lbar标志?

枚举是否永远不会在API中使用?

我正在使用提供给我的C库。 我在编译库时使用的编译器,版本,选项等信息有限。 库接口在传递的结构中使用enum ,并直接作为传递的参数使用。 问题是:当我编译代码以使用提供的库时,我如何保证或确定我的编译器将使用相同大小的enum ? 如果没有,则结构将不会排列,并且参数传递可能会混乱,例如long与int 。 我的担忧源于C99标准,该标准规定了enum类型: 应与char,有符号整数类型或无符号整数类型兼容。 类型的选择是实现定义的,但应能够表示枚举的所有成员的值。 据我所知,只要最大值适合,编译器就可以选择任何类型,它非常随意,有效地随心所欲,不仅可能在编译器之间变化,而且可能在同一编译器和/或编译器选项的不同版本之间变化。 它可以选择1,2,4或8字节表示,从而导致结构和参数传递中的潜在不兼容性。 (它也可以选择签名或未签名,但我没有看到在这种情况下出现问题的机制。) 我在这里错过了什么吗? 如果我没有遗漏某些内容,这是否意味着永远不应该在API中使用enum ? 更新: 是的,我错过了什么。 虽然语言规范在这里没有帮助,但正如@Barmar所指出的应用程序二进制接口(ABI)所做的那样。 或者如果没有,则ABI不足。 我系统的ABI确实指定enum必须是带符号的四字节整数。 如果编译器不服从,那就是一个bug。 给定完整的ABI和兼容编译器, enum 可以在API中安全使用。