C ++ linux: dlopen não consegue encontrar a biblioteca .so

Pergunta reescrita (embora já tenha sido resolvida):

Eu tenho tido problemas para usar o dlopen (3) para carregar uma biblioteca de objetos compartilhados no linux. A biblioteca é parte de um sistema de bibliotecas construídas por mim que são carregadas em tempo de execução por um executável central. Tudo isso é organizado em um único espaço de trabalho em Code :: Blocks, onde cada projeto recebe sua própria pasta em um diretório chamado Source, que deve ser enviado com o programa. O diretório de compilação do executável é dois diretórios para trás a partir de seu próprio código fonte para que o exectuable e a pasta Source estejam no mesmo diretório. As bibliotecas também constroem no mesmo diretório que o executável, então naturalmente eu passo o nome da biblioteca Estou tentando abrir como mostrado:

int main(int argc, char** argv) {
    void* hLibrary = dlopen("libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
    if(hLibrary == NULL) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }

    return 0;
}

Isso estava funcionando em um ponto quando o diretório de compilação era o mesmo que o código-fonte, até que mudei os diretórios do código-fonte para o arranjo descrito acima. O problema neste momento é que dlerror () retorna "Não é possível abrir libLibrary.so: nenhum arquivo ou diretório," mesmo que o arquivo claramente exista e esteja no mesmo diretório que o executável. Eu tentei passar em "/libLibrary.so", porque de acordo com a página man em dlopen (3), adicionar um / indica um diretório relativo. Isso retornou o mesmo erro.

A solução para isso foi que um "./" era necessário - onde "." representa o diretório de trabalho do executável - e o diretório de trabalho precisava ser alterado em Code :: Blocks para onde o executável deveria ser construído. O seguinte funciona perfeitamente:

void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);

Isso realmente não mostra a solução completa, mas o seguinte é basicamente o equivalente ao que estou fazendo:

void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);

Espero que isso explique a situação um pouco melhor.

questionAnswers(2)

yourAnswerToTheQuestion