tags:

views:

675

answers:

4

I have a small piece of code that depends on many static libraries (a_1-a_n). I'd like to package up that code in a static library and make it available to other people.

My static library, lets call it X, compiles fine.

I've created a simple sample program that uses a function from X, but when I try to link it to X, I get many errors about missing symbols from libraries a_1 - a_n.

Is there a way that I can create a new static library, Y that contains X and all the functionality needed by X (selected bits from a_1 - a_n), so that I can distribute just Y for people to link their programs to?


UPDATE:

I've looked at just dumping everything with ar and making one mega-lib, however, that ends up including a lot of symbols that are not needed (all the .o files are about 700 MB, however, a statically linked executable is 7 MB). Is there a nice way to include only what is actually needed?


This looks closely related to How to combine several C/C++ libraries into one?.

+3  A: 

Static libraries do not link with other static libraries. The only way to do this is to use your librarian/archiver tool (for example ar on Linux) to create a single new static library by concatenating the multiple libraries.

Edit: In response to your update, the only way I know to select only the symbols that are required is to manually create the library from the subset of the .o files that contain them. This is difficult, time consuming and error prone. I'm not aware of any tools to help do this (not to say they don't exist), but it would make quite an interesting project to produce one.

anon
Hi Neil, I've updated the question -- do you know any way of including only the .o files that are necessary?
Jason Sundram
+1  A: 

A static library is just an archive of .o object files. Extract them with ar (assuming Unix) and pack them back into one big library.

Nikolai N Fetissov
+2  A: 

If you are using Visual Studio then yes, you can do this.

The library builder tool that comes with Visual Studio allows you to join libraries together on the command line. I don't know of any way to do this in the visual editor though.

lib.exe /OUT:compositelib.lib  lib1.lib lib2.lib
John Knoeller
+1  A: 

I suggest you break up the libraries into separate object files. Let this be your repository.

You can use your library tool to build a library containing only the object files that you need. Many compilers will include a library all or nothing; so you get all the functions in the library whether you use them or not.

Some linkers are better and they go to the file level. You get all the functions in the file whether they are used or not. This may be a reason to have one function per file.

I don't know of a librarian tool that will resolve symbols and output a new library containing only resolved functions. Perhaps there is one, but it is not a highly used application.

Thomas Matthews