C ++ linux: dlopen no puede encontrar la biblioteca .so

Pregunta regrabada (aunque ya ha sido resuelta):

He tenido problemas para usar dlopen (3) para cargar una biblioteca de objetos compartida en Linux. La biblioteca forma parte de un sistema de bibliotecas que yo construyo y que todas son cargadas en tiempo de ejecución por un ejecutable central. Todo esto se organiza en un solo espacio de trabajo en Code :: Blocks, donde cada proyecto recibe su propia carpeta dentro de un directorio llamado Source, que se enviará con el programa. El directorio de compilación del ejecutable es dos directorios hacia atrás desde su propio código fuente para que exectuable y la carpeta Source estén en el mismo directorio. Las bibliotecas también se construyen en el mismo directorio que el ejecutable, así que naturalmente paso el nombre de la biblioteca. Estoy tratando de abrir como se muestra:

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;
}

Esto estaba funcionando en un momento en el que el directorio de compilación era el mismo que el código fuente, hasta que cambié los directorios del código fuente a la disposición descrita anteriormente. El problema en este punto es que dlerror () devuelve "No se puede abrir libLibrary.so: no existe dicho archivo o directorio", aunque el archivo existe claramente y está en el mismo directorio que el ejecutable. Luego intenté pasar "/libLibrary.so" en su lugar, porque de acuerdo con la página man en dlopen (3), agregar un / indica un directorio relativo. Esto devolvió el mismo error.

La solución a esto fue que se necesitaba un "./" - donde "." representa el directorio de trabajo del ejecutable, y el directorio de trabajo debe cambiarse en Código :: Bloques donde se construirá el ejecutable. Lo siguiente funciona perfectamente:

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

Esto realmente no muestra la solución completa, pero lo siguiente es básicamente el equivalente a lo que estoy haciendo:

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

Esperemos que esto explique la situación un poco mejor.

Respuestas a la pregunta(2)

Su respuesta a la pregunta