Tag: 链接器

Clang,Microsoft链接器和标准库

我已经使用Microsoft C ++成功构建了Clang,并且我正在尝试编译一个hello world测试用例; 它可以生成一个目标文件,链接标准库是剩下的绊脚石: hello-202520.o : error LNK2019: unresolved external symbol _printf referenced in function _main LINK : error LNK2001: unresolved external symbol _mainCRTStartup 前几年有评论称Clang还没有进行Windows链接,但我得到了那些过时的印象,现在它确实能够生成Windows格式的目标文件: clang -c hello.c ren hello.o hello.obj link hello.obj …没有barf,所以文件格式似乎是正确的,但仍然得到未解决的外部符号错误。 可能的猜测是Microsoft编译器标记其输出目标文件,并指示他们需要链接的标准库,而Clang没有,并且眼睛对相应目标文件的hex转储似乎证实了这一点,并给出了一个暗示链接器命令行使用: link /defaultlib:libcmt /defaultlib:oldnames hello.obj 我对这个阶段寄予厚望,但是它仍然给出了同样未解决的外部符号错误。 我还缺少什么?

在c中链接具有多个主要function的文件

是否可以使用makefile链接两个C文件,该文件调用彼此的函数,但两者都有自己的main函数。 例如:C1.c使用C2.c中的函数f()但两者都有main函数,我希望C1.c中的main只被视为main 。 FILES.o=set.o hash.o printnfa.o input.o nfa.o dfa.o terp.o minimize.o defnext.o print_ar.o pairs.o squash.o signon.o print.o lex.o assort.o prnt.o printv.o bintoasc.o ferr.o onferr.o fputstr.o pchar.o driver.o searchenv.o hashadd.o esc.o PROGRAM= Lexer INC := -I./debug.h -I./global.h -I./stack.h -I./set.h -I./hash.h CFLAGS=-DMAIN all: ${PROGRAM} ${PROGRAM}: ${FILES.o} ${CC} -o $@ ${CFLAGS} $(INC) $^ ${LDFLAGS} ${LDLIBS} 现在terp.c有一个main和lex.c也有一个main 。 我只想要考虑lex.c的main内容。

我可以在1 C ++项目中混合使用c和cpp文件吗?

我还是初学者,我正在使用eclipse。 我有一个项目,其中混合了c文件和cpp文件。 链接器向我抛出错误: undefined reference to 将所有*.c文件重命名为*.cpp ,错误消失。 所以我不能混合这些文件或这是一些编译器/链接器选项问题? 我的选择: GCC C ++编译器: -I/usr/include/glib-2.0 -I/usr/include/gtk-2.0 -I”/myPath” -O0 -g3 \ -Wall -c -fmessage-length=0 `pkg-config –cflags glib-2.0 gtk+-2.0 GCC C编译器: -I/usr/include/glib-2.0 -I/usr/include/gtk-2.0 -I”/myPath” -O0 -g3 \ -Wall -c -fmessage-length=0 -std=c99 `pkg-config –cflags glib-2.0 gtk+-2.0` GCC C ++链接器: -L/usr/include/glib-2.0/glib `pkg-config –libs gtk+-2.0` 好吧,因为它说的是C ++ Linker,这是否意味着c文件中的目标文件无法链接到项目中(默认情况下)?

放置在静态库中时找不到_sbrk函数

我正在为stm32f407微控制器创建一个裸机应用程序,该应用程序具有ARM Cortex M4内核。 因此,我正在自己提供像_sbrk这样的函数的实现。 我现在发现,当我尝试创建一个包含_sbrk的静态库,并将它与我的main.c链接到一个应用程序时,链接器说 “C:/progra~2/gnutoo~1/4947e~1.920/bin /../ LIB / GCC /臂-NONE-EABI / 4.9.3 /../../../../臂无-eabi / lib / armv7e -m / softfp \ libg_nano.a(lib_a-sbrkr.o):在函数_sbrk_r:sbrkr.c :(。text._sbrk_r + 0xc):未定义引用`_sbrk’“。 如果我从静态库中取出相同的函数,并将其放入main.c ,那么所有编译/链接/运行都很好。 我几乎可以肯定这与链接器在所有库中读取的顺序有关,并且当我自己的静态库被读取时, _sbrk需要_sbrk定义,因此被抛出,只是为了找到它无论如何,当后面的一个标准库被链接时,它是必需的。但是,我自己没有指定任何标准库,因此不能改变链接这些库的顺序。 我还尝试将_sbrk函数声明为__attribute __ ((__ used__ )) ,认为链接器不会丢弃该函数,但唉,这还没有解决我的问题。 所以我的问题是,如何将_sbrk放入静态库中,而不会_sbrk未解析的引用? 更新:链接最终应用程序的命令是: C:\ PROGRA~2 \ GNUTOO~1 \ 4947E~1.920 \ bin \ AR10B2~1.EXE -g -mcpu = cortex-m4 -mfpu = fpv4-sp-d16 […]

链接libxml2时出错

我有一个libxml2的简单示例,但它返回以下错误: $ gcc -Wall -lxml2 -I/usr/include/libxml2 -o ex1 ex1.c /tmp/cc6OKSKJ.o: In function `main’: ex1.c:(.text+0x60): undefined reference to `xmlReadFile’ ex1.c:(.text+0x70): undefined reference to `xmlDocGetRootElement’ collect2: ld returned 1 exit status $ xml2-config –libs -lxml2 $ xml2-config –cflags -I/usr/include/libxml2 我在Lubuntu 11.10 x86_64上,我有我需要的所有软件包(我认为):libxml2,libxml2-dev,libxml2-dbg …这是示例的代码: // gcc -Wall -lxml2 -I/usr/include/libxml2 -o ex1 ex1.c #include #include #include int main(int argc, […]

为什么链接器会在.rela.plt中生成看似无用的重定位?

首先,我正在玩的玩具程序: prog.c中: int func1(); int main(int argc, char const *argv[]) { func1(); return 0; } lib.c: int func1() { return 0; } 建立: gcc -O3 -g -shared -fpic ./lib.c -o liba.so gcc prog.c -g -la -L. -o prog -Wl,-rpath=$PWD 对于完整性: $ gcc –version gcc (GCC) 6.3.1 $ ld –version GNU ld version 2.26.1 现在,我的问题。 我已经确认了我所读到的关于动态符号的延迟绑定是如何工作的,即最初func1的GOT条目指向PLT后面的指针,然后是跳转后的指令: […]

什么是绝对符号以及如何在C中定义它?

在nm的手册页中。 它说 “A”符号的值是绝对值,不会因进一步链接而改变。 但是,我不知道这意味着什么。 如何定义变量或其他东西以使其值在C中绝对? 如果我在test.c中的文件范围中声明一个变量 int a; 然后在nm的输出中,a的条目将在我的机器上进行以下操作 0000000000000004 C a 所以我想知道我该怎么做才能使变量的nm输出为“A”。 我不知道“绝对”是什么意思。

C / cmake – 在TARGET_LINK_LIBRARIES中指定库时,如何向(未使用的)库添加链接器标志?

在我的项目的根目录中,我有一个my_lib的子目录和另一个my_app的子目录。 库my_lib定义了填充链接器定义的部分的表,这些表不是my_app直接使用的,因此该库未链接。 为了强制my_lib被链接,我添加了标志–whole-archive,如下所述。 它的工作原理! 在根目录的CMakelist.txt中,我有以下内容: SET(CMAKE_EXE_LINKER_FLAGS “-mmcu=cc430f6137 -Wl,–gc-sections -Wl,–whole-archive -lMY_LIB -Wl,–no-whole-archive”) ADD_SUBDIRECTORY(my_lib) 在CMakelist.txt的my_lib我有: ADD_LIBRARY(MY_LIB my_lib.c ) TARGET_LINK_LIBRARIES(MY_LIB) 在my_app的CMakelist.txt ,我有: ADD_EXECUTABLE(my_app my_app.c) TARGET_LINK_LIBRARIES(my_app MY_LIB) 我的问题是,如果在my_app CMakelist.txt中的TARGET_LINK_LIBRARIES中指定了CMakelist.txt ,我只想使用此标志( MY_LIB –whole-archive )。 如果最后一行TARGET_LINK_LIBRARIES(my_app MY_LIB)不存在,我不想在”-Wl,–whole-archive -lMY_LIB -Wl,–no-whole-archive”添加”-Wl,–whole-archive -lMY_LIB -Wl,–no-whole-archive” 。 我试图从root中的CMakelist.txt中删除此标志,并将以下内容添加到my_lib子目录中的CMakelist.txt中: SET_TARGET_PROPERTIES(MY_LIB PROPERTIES CMAKE_EXE_LINKER_FLAGS “-Wl,–whole-archive -lMY_LIB -Wl,–no-whole-archive”) 但这不起作用。 我怎样才能做到这一点?

用C头文件编译Cython错误

所以我试图用Cython包装一些C代码。 我阅读了阅读应用Cython的教程来做这个( 1,2 ),但这些教程没有说明如何编译代码一旦你用Cython包装它,所以我有一个错误说它找不到我的C码。 首先,我的cython脚本(“calcRMSD.pyx”): import numpy as np cimport numpy as np cdef extern from “rsmd.h”: double rmsd(int n, double* x, double* y) #rest of the code ommited 我试图包装的C代码(“rmsd.h”): #include #include #include #include extern “C” { // svd from lapack void dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*, int*,double*,int*,int*); } double rmsd(int n, double* x, double* y) { //code omitted […]

什么是链接符号__TMC_END__和__TMC_LIST__?

我已经问了这个问题 ,偶然发现了似乎是由链接器生成的__TMC_END__符号。 我不知道它的目的是什么,唯一有用的参考是这个bug并没有解释为什么它存在。 但是,它会引用类似的符号__TMC_LIST__ 。 有谁知道这些用途是什么?