How to link Boost in a dependent static library

2019-01-18 02:55发布

问题:

In MS Visual C++ 2010

I had a single C++ project in my solution which used boost and worked perfectly.

I then decided to convert this project into a static library and create a new project which depends on this static library.

Now, my converted static library builds without errors and warnings (compiler and linker) but the new project compiles but does not link.

I am getting:

1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib'

As a test I added the full directory path to the linker options for this library... and then it complained about

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib'

I have now added complete paths to all the libraries and it now builds and run.

I am not happy with this solution because:

  1. I don't want users of the library to have to worry about linking in boost.
  2. It is messy

I know an answer would be to create a DLL but is there a way to do this statically and keep the linking at my static library level.

Edit:

If I tell the .exe linker to ignore the boost libs explicitly then it all is ok except the .exe should not have to worry about boost at all.

/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib"

回答1:

Apparently you don't need the .libs, as your exe also links without them. You seem to be using boost header-only methods and classes. So just tell boost to disable auto linking by defining the preprocessor symbol BOOST_ALL_NO_LIB in your project.

If you want to make your .lib unnecessary big by including all of boost, this question seems to hold an answer (which I never really tried myself): Linking static libraries to other static libraries



回答2:

When building your library, you can include the boost libraries in yours. To do so, in VisualStudio's Librarian > General property page, list your boost libraries as Additional Dependencies.

However, there may be a problem if your clients use boost themselves, and statically link to it (especially a different version than the one you are using).



回答3:

Did you build boost library? There are certain libraries in Boost that needs to be compiled. In case if you haven't done that, refer to "Getting started in Windows" on how to build the Boost library.

EDIT-1: Boost can be built both as a static and dynamically loadable (dll) libraries.

EDIT-2: If you have already built Boost, then the answer by @Daniel Gehriger tells you how to add it in VS.