Search code examples
c++linuxlinkage

Linking to lib on Linux without headers


Hello I'm trying to link to a library without headers. I wrote prototype exactly as defined in library, but ld cannot link it.

readelf -Ws Release/libcef.so | grep KeyStringToDomKey

386822: 00000000066d73d0   328 FUNC    LOCAL  HIDDEN    17 _ZN2ui16KeycodeConverter17KeyStringToDomKeyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE

readelf -Ws main-6cf4e2.o | grep KeyStringToDomKey

  13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZN2ui16KeycodeConverter17KeyStringToDomKeyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE
#include <iostream>
#include <string>
#include "domkey.h"

namespace ui {
    class KeycodeConverter {
    public:
        static DomKey KeyStringToDomKey(const std::string&);
    };
}

using namespace std;

int main()
{
    auto t = ui::KeycodeConverter::KeyStringToDomKey("t");
    cout << "Hello World!" << endl;
    return 0;
}

Solution

  • 386822: 00000000066d73d0 328 FUNC LOCAL HIDDEN 17 _ZN2u...

    HIDDEN is the key here: this symbol is not visible outside of the shared library (neither to static linker /usr/bin/ld, nor to the dynamic loader).