Tag: 静态库

c模块中的命名空间或包

我是初学者级别的程序员,来自高级语言,感觉像c是扁平结构。 有没有一种模拟包的方法,所以我可以有一个干净的命名空间,而不需要前缀。 嵌套结构是我正在看的。 它是如何与第三方外部库一起工作的,当名称冲突时会发生什么,或者它是如何分开的。 如果我要构建一个库或一个与libs链接的多模块应用程序,那么每个模块可以有一个与另一个模块相同的变量,函数或结构名称。 此外,如果您链​​接两个名称冲突的第三方库(.a文件等),您如何解决此类冲突。

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

用windows链接linux静态库和cygwin

我有一个二进制静态库libfoo.a编译为32位Linux机器。 我希望在我用cygwin编译的win32项目中编译它。 那可能吗? 这似乎是可能的,因为存档中的所有目标文件都应该是标准的ELF格式。 但是我一直在收到有关nm在libfoo.a找到的函数的链接错误。 当我创建一个存根libfoo.a ,其中包含一些与libfoo.a相同名称的空函数时,我没有收到有关这些函数的链接错误。 这是可能的还是我错过了什么? 无论如何,我该如何解决这个问题?

聚合静态库

我尝试将多个.a文件聚合为一个。 该命令如下: TARGET=libnumpy.a DIR=build/lib.linux-x86_64-2.6/numpy FILES=$(DIR)/core/_sort.a $(DIR)/core/multiarray.a $(DIR)/core/umath.a $(DIR)/core/scalarmath.a $(DIR)/core/umath_tests.a $(DIR)/core/multiarray_tests.a $(DIR)/lib/_compiled_base.a $(DIR)/numarray/_capi.a $(DIR)/fft/fftpack_lite.a $(DIR)/linalg/lapack_lite.a $(DIR)/random/mtrand.a all: ar cr $(TARGET) $(FILES) 但是生成的库libnumpy.a无法使用。 当我尝试用它编译一些东西时,我明白了 libnumpy.a: could not read symbols: Archive has no index; run ranlib to add one (我试图运行ranlib,但它没有解决问题) 在做nm libnumpy.a的时候我得到了 nm: _sort.a: File format not recognized nm: multiarray.a: File format not recognized nm: umath.a: File format […]

两个包含不同function的.lib同名:如何选择合适的?

我有两个静态库lib1.lib,lib2.lib(不是他们的代码),具有相同的函数原型,但具有不同的实现。 我尝试包括两者,它似乎始终使用包含的第一个库中的实现。 如果我在项目中包含它们,有没有办法从特定的库中选择实现?

如何使用visual studio 2010编写静态ansi-c库

当我在VS2010中编写和编译lib文件时,我遗漏了一些东西。 我不知何故没有正确标记出口。 控制台命令dumpbin.exe -headers mylib.lib > stackoverflow.txt生成以下输出。 (我删除了空行) Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file mylib.lib File Type: LIBRARY ANON OBJECT HEADER VALUES 1 version 14C machine (x86) 515AC7B8 time date stamp Tue Apr 02 13:57:44 2013 ClassID: {0CB3FE38-D9A5-4DAB-AC9B-D6B6222653C2} 171A size 0 flags 我创建了一个新的空项目。 新项目是一个空的静态库项目,没有预编译的头文件。 我把它命名为mylib。 […]

从C ++引用静态库中的C函数

我有一个用C编写的静态函数库。假设头文件名为myHeader.h,看起来像: #ifndef MYHEADER_H #define MYHEADER_H void function1(); void function2(); #endif function1和function2不是什么特别的东西。 假设它们存在于一个名为impl1.c的文件中,它看起来像: #include “myHeader.h” void function1() { // code } void function2() { // more code } 到目前为止提到的所有代码都被编译成一个名为libMyLib.a的静态库。 我宁愿不修改用于构建此库的任何代码。 我还有一个C ++标题(cppHeader.h),如下所示: #ifndef CPPHEADER_H #define CPPHEADER_H class CppClass { private: double attr1; public: void function3(); }; #endif 然后cppHeader.cpp看起来像: #include “cppHeader.h” #include “myHeader.h” // constructor CppClass::CppClass(){} void […]

C:使用Makefile创建静态库和链接

我试图了解静态和共享库 。 我想要执行以下操作来创建一个makefile,它将单独的编译和链接分开,以便在形成最终的静态可执行文件时创建和链接静态库。 我有Makefile的以下代码,但我收到以下错误 Makefile:13: *** missing separator. Stop. 但我也试图了解如何实际链接/创建库。 如果我在终端中的line 12之后运行它们工作的命令,而不是在makefile中。 myProgram: main.o addSorted.o freeLinks.o gcc -lm -o myProgram main.o addSorted.o freeLinks.o main.o: main.c gcc -O -c -lm main.c main.h addSorted.o: addSorted.c addSorted.h gcc -O -c -lm addSorted.c freeLinks.o: freeLinks.c freeLinks.h gcc -O -c -lm freeLinks.c ar rc libmylib.a main.o addSorted.o freeLinks.o //Error Line […]

从可执行文件中提取静态链接库

我不确定这是否可行,但是给定了一个可执行文件(foo.exe),其中有许多已静态链接的库。 是否有任何软件从该文件中提取可执行文件中的.lib(或.a)? 谢谢。

库的Makefile

每次我想使用库执行程序时,我必须在终端上运行这4个命令。 线条是 cc -m32 -c mylib.c ar -rcs libmylib.a mylib.o cc -m32 -c prog.c cc -m32 prog.o -L. -lmylib ./a.out 如何为上述命令创建一个makefile并运行它? 一个详细的程序将不胜感激。 谢谢。 编辑:这是解决方案: a.out: prog.o libmylib.a cc prog.o -L. -lmylib prog.o: prog.c mylib.h libprint_int.a: mylib.o ar -rcs libmylib.a mylib.o print_int.o: mylib.c mylib.h clean: rm a.out prog.o libmylib.a mylib.o 这在第2行给出了错误,因为我使用空格而不是制表符。