Tag: 链接器

除-Ofast以外的任何内容都会导致“未定义的引用”错误

我有一个包含math.h的C程序,并使用该头文件中的sqrt函数。 非常奇怪的是,当我没有传递-Ofast标志时,我的代码无法编译。 如果我使用以下代码编译我的代码: gcc -std=c99 foo.c 要么本身,要么添加任何-O1 , -O2或-Os (那些是大写的O)到该命令,我得到以下错误: /tmp/ccAcT2Bz.o: In function `sum_of_divisors’: foo.c:(.text+0xb): undefined reference to `sqrt’ collect2: error: ld returned 1 exit status -O3给出了一个类似但更精细的错误(请注意,我不在main调用sqrt ): /tmp/ccBKvvFS.o: In function `sum_of_divisors’: foo.c:(.text+0x5c): undefined reference to `sqrt’ /tmp/ccBKvvFS.o: In function `main’: foo.c:(.text.startup+0xe5): undefined reference to `sqrt’ foo.c:(.text.startup+0xf3): undefined reference to `sqrt’ collect2: error: ld returned […]

链接静态C库时未定义的引用

在我的最新项目中,我遇到了一个关于对共享库方法的未定义引用的奇怪问题。 我搜索了SO,但我能找到的只是C ++相关(extern“C”)或者没有真正帮助。 有问题的库是我的libosm分支,它使用protobuf以二进制格式(.osm.pbf)为OpenStreetMap数据生成去/序列化代码。 有问题的函数是osmpbf__blob__unpack但这只是我最终使用的第一个,所以我怀疑它是一个普遍的问题。 我用nm检查了生成的libosm.a ,并且该方法在那里并导出但由于某种原因在链接时找不到它。 以下是我目前的旗帜。 我尝试更改顺序,甚至包括所有库两次(如另一个线程中所示),但我总是以未定义的引用结束。 CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread 目前我对错误可能很遗憾,但我认为这可能是一个小错误。 自从我使用C以来已经有一段时间..任何帮助将不胜感激。 干杯,弗洛里安 编辑:这是我完整的Makefile。 我刚刚LIBFLAGS了变量LIBFLAGS的名称,因为我使用了自己的小规则,但似乎我应该使用LDLIBS和内置规则来处理这个简单的情况。 CC = gcc CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread all: main.x main.x: main.c $(CC) $(CFLAGS) $(LIBFLAGS) main.c -o main.x […]

DLL更新后重建EXE?

我看到主题和微软官方文档( https://docs.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use ),说我们在向我们的dll添加导出function之后,我们必须重建DLL(逻辑) 和 EXE。 我不明白他们为什么这么说,经过测试后不是这样,我不需要在我添加函数到dll之后重建我的exe。 我的函数使用__declspec导出,并且有基本的C函数。 他们(链接)建议我们使用带有序数的.def文件来重建,但即使没有这个.def文件,我也不必重建。 __declspec是否也使用序数来链接dll函数或它是否使用函数命名? 你能解释一下他们为什么这么说,我哪里错了? 谢谢

“致命错误LNK1561:必须定义入口点”

我是Microsoft Visual Studio 2005的新手。我正在编写一个序列搜索程序,当我尝试使用MS VS 2005编译它时,我收到一个错误: 致命错误LNK1561:必须定义入口点 我的代码是: #include #include int search (int A[], int len, int no) { int i; for (i=0; i<len; i++) if (A[i] == no) return i; return -1; }

在Windows中使用C绑定构建Python包(VC90)会导致LNK1181致命错误

我正在尝试构建一个绑定到C库(libspotify)的Python包(pyspotify)。 我正在使用Python 2.7.5并为某些必需的命令行工具安装了VS2008 Express。 当我从命令提示符(具有管理员权限)调用python setup.py build ,我得到以下输出: running build running build_py running build_ext building ‘spotify._spotify’ extension 然后~18个,一个包中的每个.c文件: c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -Isrc -Ic:\Python\Python27\include -Ic:\Python\Python27\PC /Tcsrc\module.c /Fobuild\temp.win32-2.7\Release\src\module.obj module.c 然后是showstopper: c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:c:\Python\Python27\libs /LIBPATH:c:\Python\Python27\PCb uild spotify.lib /EXPORT:init_spotify build\temp.win32-2.7\Release\src\module.ob j build\temp.win32-2.7\Release\src\session.obj […]

链接到不进行函数调用的库有什么影响?

我有一个程序的make文件,链接到libdl.so与以下行-ldl。 没有调用dlopen或任何相关函数。 即使您不使用任何function,以这种方式链接到此库有什么影响?

无法链接BFD

我想在我的项目中包含这个文件: http : //cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html 但它需要与BFD链接。 我安装了binutils和binutils-devel 。 我尝试过连接-lbfd以及直接连接到/usr/lib64/libbfd.so和/usr/lib64/libbfd.a (两者都存在)。 我也尝试搜索pkg-config以查看我应该使用的是否有不同的标志,但是pkg-config没有引用BFD或binutils 。 无论我尝试过什么,我都会遇到以下错误: undefined reference to ‘bfd_init’ undefined reference to ‘bfd_openr’ undefined reference to ‘bfd_check_format’ undefined reference to ‘bfd_checkformat_matches’ undefined reference to ‘bfd_close’ undefined reference to ‘bfd_map_over_sections’ 首先,我正在编译我的记录器和我上面链接的backtrace-symbols.c文件(因为记录器是我打算用它来打印痕迹的地方)。 然后我将这两个目标文件一起链接到一个组合的目标文件中: CC = clang CFLAGS = -g -Wall -c SOURCE = simplog.c OBJ = simplog.o, simplog-temp.o, backtrace-symbols.o all: […]

混合编程:从C调用FORTRAN

我必须从C / C ++中调用FORTRAN子例程进行概念validation。 我不知道我的方向是什么,请指导我…. 我做的是…… 我写了以下FORTRAN代码 INTEGER*4 FUNCTION Fact (n) INTEGER*4 n INTEGER*4 i, amt amt = 1 DO i = 1, n amt = amt * i END DO Fact = amt END SUBROUTINE Pythagoras (a, b, c) REAL*4 a REAL*4 b REAL*4 cc = SQRT (a * a + b * b) […]

链接gcc没有文件的共享库?

假设我的目标系统上有一个x.so库,我的开发系统上没有x.so库。 我需要使用gcc编译我的开发机器上的程序,该程序使用该x.so在目标机器上x.so 。 有没有办法做到这一点?

更改其他静态库使用的静态库

我的项目中有2个库文件lib1.a和lib2.a。 Lib1.a正在使用lib2.a。 我给了lib2.a的源代码,但我没有lib1.a的源代码。 对于我的项目,我更改了lib2.a让我说我在函数中添加了一个局部变量。 我的问题,函数名称没有改变,我是否需要使用更改的lib2.a重新编译lib1.a? 无论如何,我告诉连接器“lib1.a应该使用新的lib2.a”没有lib1.a的源代码?