Tag: 静态库

使用CMake将几个静态库合并为一个

我有一个非常类似于cmake邮件列表中描述的问题,我们有一个依赖于许多静态库的项目(都是从各个子模块中的源代码构建的,每个子库都有自己的CMakeLists.txt描述每个库的构建过程)我想组合成一个静态库,以便向消费者发布。 我的库的依赖性可能会发生变化,我不想让开发人员在这些变化的后面进一步负担。 简洁的解决方案是将所有lib捆绑到一个单独的lib中。 有趣的是,在将目标设置为mylib并使用它时, target_link_libraries命令并未组合所有静态。 。 target_link_libraries(mylib abcd) 但是,奇怪的是,如果我将mylib项目作为可执行项目的子模块,并且仅在顶级可执行文件CMAkeLists.txt中链接mylib ,那么该库似乎确实是组合在一起的。 即,当我将目标设置为仅构建mylib时,mylib为27 MB,而不是3 MB。 有一些解决方案描述了将lib解压缩到目标文件并重新组合( 这里和这里 ),但是当CMake看起来完全能够自动合并lib时,这似乎非常笨拙,如上例所述。 它有一个我失踪的神奇命令,或推荐的优雅方式制作发布库?

.o .a和.so文件有什么区别?

我知道.o是目标文件,.a是静态库,.so是动态库吗? 它们的物理意义是什么? 我何时可以使用,何时不使用?

意外的未定义引用

我得到一个未定义的引用错误,不知道原因。 所以我有两个文件构成一个静态的lib:keyboard_input.c,keyboard_input.h 这是.h文件的内容: #ifndef __MOD_KBINPUT__ #define __MOD_KBINPUT__ int kbInit(); int kbWait(); int kbTest(); #endif 并且CMakeLists.txt文件如下所示: FILE( GLOB_RECURSE sources *.c ) INCLUDE_DIRECTORIES(“${PROJECT_SOURCE_DIR}/include/utils/kbreader”) ADD_LIBRARY(keyboardReader ${sources}) 编译此lib会发出一些警告: src/utils/kbreader/keyboard_input.c: In function ‘kbInit’: src/utils/kbreader/keyboard_input.c:13:14: warning: assignment from incompatible pointer type [enabled by default] src/utils/kbreader/keyboard_input.c: In function ‘kbWait’: src/utils/kbreader/keyboard_input.c:21:55: warning: passing argument 4 of ‘fread’ from incompatible pointer type [enabled by […]

静态Vs动态库

我读过有关静态和动态库的内容。 我的问题很少说明 dlopen dlclose: Benifit of dlopen is we can start the EXE with out loading the necessary libraries at the begining. Only when we need we will load the libratries and unload it from the memory. 这是动态链接库的行为。 我的问题是,如果我链接库libUtlities ld -o EXE main.o -lUtilities 当我运行EXE时,在我第一次使用这些function之前,libUtlities将被加载到内存中 which i observed in dbx (Solaris debugger) But will not […]

如何将.a C静态库添加到Xcode并在那里使用它?

我有一个用arm7-gcc编译的静态C库,我想在我的iOS项目中使用它。 我把它添加到项目但我无法弄清楚如何使用它。

静态库如何链接到依赖项?

说我有libA。 它取决于例如libSomething,因为libA的非内联方法调用了libSomething.h中的方法。 在这种情况下,依赖关系如何链接? libA在编译时是否必须静态链接到libSomething,或者libA用户(使用libA的应用程序)是否需要链接到libA和libSomething? 谢谢

我可以通过链接静态库来构建共享库吗?

我有一堆静态库(* .a),我想构建一个共享库(* .so)来链接这些静态库(* .a)。 我怎么能用gcc / g ++这样做?

静态链接ncurses到程序

我有一些问题静态地将ncurses链接到我的一个程序 这是一个非常简单的示例程序: #include int main(){ initscr(); printw(“Hello world\n”); refresh(); getch(); endwin(); return 0; } 当我用它编译它 gcc -static -lncurses hello_curses.c -o curses 我收到这些错误: /tmp/ccwHJ6o1.o: In function `main’: curses_hello.c:(.text+0x5): undefined reference to `initscr’ curses_hello.c:(.text+0x14): undefined reference to `printw’ curses_hello.c:(.text+0x1b): undefined reference to `stdscr’ curses_hello.c:(.text+0x20): undefined reference to `wrefresh’ curses_hello.c:(.text+0x27): undefined reference to `stdscr’ curses_hello.c:(.text+0x2c): undefined reference to […]

将共享库与静态库链接:静态库的编译方式必须与应用程序链接它的方式不同吗?

至少在Linux和Solaris上,静态库实际上只是一堆编译好的.o文件被扔进一个大文件中。 编译静态库时,通常会忽略-fpic标志,因此生成的代码与位置有关。 现在说我的静态库是B.我已经构建了它并且得到了.a文件,它实际上只是所有位置相关的.o文件的全局。 现在我有一个我想构建的共享库,A,我希望它静态链接B.当我构建A时,我自然会使用-fpic标志使生成的代码位置独立。 但是,如果我链接B,我不是混合位置依赖和位置独立的目标文件? 除非我还指定-mimpure-text,否则我会收到很多文本重定位错误,我认为这可能是原因。 看来,当我编译一个库时,我真的需要编译它3次,共享版本,静态版本和静态 – 可以使用的共享库版本。 我对吗? 我可以继续使用-mimpure-text但g ++手册页说如果你这样做,对象实际上并没有最终被共享(不清楚它是否全部未被共享,或者仅仅是静态链接的部分,有人知道吗?) 。

如何链接到C中的静态库?

我使用code :: blocks来编译我的静态库。 输出结果是libstatic.a文件。 现在,如何链接到我的库以使用已编译的函数? (我尝试使用#include“libstatic.a”,但我的项目没有编译)