background knowledge:
First I explain what do I understand of these gcc flags so far:
-L: As the gcc manual states, this flag add specified directory "to the list of directories to be searched for-l"
-l: Again as manual said, "Search the library named library when linking."
So, what I understand of these two, is first one adds directories to a list which, named library by the second one will be searched in, by the linker!
-I: As for this, manual says: "Add the directory dir to the list of directories to be searched for header files during preprocessing"! So I assume this one does the same as-Lbut for header files.
-Wl: The -Wl portion sends comma-separated options to the linker
What I'm trying to do:
I want to compile/build an executable which uses 3 .so shared libraries; And 2 of those (libpq and libsqlite3) are provided by official 3rd party vendors (Postgresql and Sqlite); And installed with apt install.
The 3rd one is one of mine; I wrote it myself and trying to link it with my executable to be able to use it at runtime.
What I tried so far:
If I compile my code without my own library (and respective function inside the code) using below command, it works fine:
g++ -std=c++20 full.cpp -o loadTester -L/usr/include/postgresql/libpq -lpq -lsqlite3
However, using these command, to also link my own library with my code, I get errors:
gcc -std=gnu17 -shared -o liblogwritter.so -fPIC logWritter.c
g++ -std=c++20 full-with-logger.cpp -o loadTester -L/usr/include/postgresql/libpq -L./ -lpq -lsqlite3 -llogwritter -Wl,-rpath=./ -I./
I've also tried by replacing ./ parts with the full path: /home/username/Desktop/Current/.
Error:
/usr/bin/ld: /tmp/ccSFD38J.o: in function `pgConncetionInit(char const*)':
full-with-logger.cpp:(.text+0xc3): undefined reference to `logWritter(char const*)'
/usr/bin/ld: /tmp/ccSFD38J.o: in function `pgInsertQuery(char**)':
full-with-logger.cpp:(.text+0x709): undefined reference to `logWritter(char const*)'
/usr/bin/ld: /tmp/ccSFD38J.o: in function `main':
full-with-logger.cpp:(.text+0x1994): undefined reference to `logWritter(char const*)'
/usr/bin/ld: full-with-logger.cpp:(.text+0x19e2): undefined reference to `logWritter(char const*)'
/usr/bin/ld: full-with-logger.cpp:(.text+0x1b0e): undefined reference to `logWritter(char const*)'
collect2: error: ld returned 1 exit status
Code for the library:
logWriter.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SV_SOCK_PATH "/tmp/shahab_logger"
int logWritter(const char* messageData)
{
    struct sockaddr_un addr;
    // Create a new client socket with domain: AF_UNIX, type: SOCK_STREAM, protocol: 0
    int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    // Construct server address, and make the connection.
    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path) - 1);
    if (connect(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) == -1)
    {
        fprintf(stderr, "Error connecting to server\n");
        return 0;                
    }
    write(sfd, messageData, strlen(messageData));
    close(sfd);
    return 0;
}
logWriter.h:
#ifndef LOGWRITTER_H
#define LOGWRITTER_H
 
int logWritter(const char* messageData);
 
#endif  // LOGWRITTER_H
myprogram.cpp:
... //Several lines removed
logWritter(jobExecTime.c_str());
... //Several lines removed
Note:
I made a simple driver program for my library as below and it was working fine (Provided that I ran the server.c before to accept socket connection):
#include <stdio.h>
#include <stdlib.h>
#include "logWritter.h"
int main()
{
    printf("Test driver program!\n");
    if (logWritter("Test driver program!") > 0)
    {
        printf("Error!\n");
        exit(1);
    }
    return 0;
}
And I compiled this driver program as below:
gcc -c -Wall -Werror -fpic logWritter.c
gcc -shared logWritter.o -o liblogwritter.so
gcc -Wall testDriver.c -o testDriver -L/home/username/Desktop/logger/ -llogwritter -Wl,-rpath=/home/username/Desktop/logger/
Note 2:
Here is the list of files inside /home/username/Desktop/Current/ (which all files exist) just in case:
activity_main.db  full.cpp  full-with-logger.cpp  liblogwritter.so  logServer
logWritter.c  logWritter.h  postgresInit.sql  run.sh  server.c  sqliteInit.sql  unix_socket.h
Question:
I think it obvious at this point, after reading such lengthy post (my greatest regards and appreciation for your king effort and time in advance) but to follow standards here:
- Are my understanding which I explained in the first section, correct?
- What am I missing (knowledge-wise)?
- How should I compile my executable? Please explain for both two cases which I copied the header file in /usr/include/and shared library file in/usr/local/lib, or if I want to link them from current working folder, as it is now in the case of examples above.
 
    