macosc++11boostapple-m1quantlib

Undefined Boost symbol when linking to pre-compiled QuantLib binaries on MacOS


I am trying to compile some C++ that depends on QuantLib, which in turn depends on Boost. I am working on a MacBook Pro M1 (ARM architecture). I installed Boost and QuantLib using the instructions on this page: https://www.quantlib.org/install/macosx.shtml. I then tried to compile the following source code:

#include <iostream>
#include <ql/quantlib.hpp>
 
int main(int, char*[])
{
    QuantLib::Option::Type OptionType(QuantLib::Option::Call);
    std::cout << "Option Type = " << OptionType << std::endl;
    
    return 0;
}

using the following command:

clang++ -std=c++11 ql_ex1.cpp -o build/ql_ex1 $(INC) $(LIB) \
    -I/opt/homebrew/Cellar/quantlib/1.23/include -I/opt/homebrew/Cellar/boost/1.76.0/include \
    -L/opt/homebrew/Cellar/boost/1.76.0/lib -L/opt/homebrew/Cellar/quantlib/1.23/lib

This gave me the following error message:

Undefined symbols for architecture arm64:
  "boost::assertion_failed(char const*, char const*, char const*, long)", referenced from:
      long double boost::math::detail::sinpx<long double>(long double) in ql_ex1-044d3e.o
  "boost::assertion_failed_msg(char const*, char const*, char const*, char const*, long)", referenced from:
      boost::array<long double, 171ul>::operator[](unsigned long) const in ql_ex1-044d3e.o
...
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1

So far I have tried the following approaches,

Can someone point me to where (if anywhere) this symbol is defined? It would be useful to know if I am just missing the right compiler options or whether there is a more fundamental issue that needs to be addressed.


Solution

  • I think you're missing a -lQuantLib in your command line? You're telling the compiler where to look for the libraries (the -L switches`) but not which libraries to link.

    Also, check whether homebrew also installed a quantlib-config script on your computer. If so, it should provide the switches you need; try running

    quantlib-config --cflags
    

    which should output the -I flags specifying the location of the QuantLib headers (and possibly the -std=c++11 flag you're passing manually), and

    quantlib-config --libs
    

    which should output the corresponding -L switches as well as the -lQuantLib you missed.

    If they work, you can use the command

    clang++ ql_ex1.cpp -o build/ql_ex1 $(INC) $(LIB) \
    -I/opt/homebrew/Cellar/boost/1.76.0/include \
    `quantlib-config --cflags` `quantlib-config --libs`
    

    and let the script fill in the info for you.