-
Notifications
You must be signed in to change notification settings - Fork 243
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Undefined references while compiling project #820
Comments
Similar issue #732 This may be due to different compile-time options, especially the |
It use by default C++17 for the compilation. Also I tried changing it to C++20 but doesn't work. |
If the compile options match, then there may be another version libpqxx installed on the machine and the linker links to it. |
Nope. I'm using a docker container with empty RHEL9 image, and this is all the portion of dockerfile code relationated with libpqxx: # Install postgresql library libpqxx
RUN yum install --nogpgcheck -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm && \
yum install --nogpgcheck --skip-broken -y postgresql14-14.7 postgresql14-devel-14.7 postgresql14-libs-14.7
WORKDIR /opt
# Download libpqxx
RUN wget https://github.com/jtv/libpqxx/archive/refs/tags/7.9.0.tar.gz -O Libpqxx.tar.gz
# Create directory for pqxx
RUN mkdir -p libpqxx
# Extract libpqxx
RUN tar xvfz Libpqxx.tar.gz -C libpqxx --strip-components=1
WORKDIR /opt/libpqxx
RUN ./configure --with-postgres-lib=/usr/pgsql-14/lib --with-postgres-include=/usr/pgsql-14/include --build=aarch64-unknown-linux-gnu
RUN make && make install |
Is the default compiler for that Docker image |
Yes, the default compiler is g++. By the way I tried compiling with prebuilt libpqxx with yum, and I got fewer errors.
|
Are object files ( |
Yes.
Cannot find it because I don't have any official package suscription. I'm installing all the packages individually RUN yum update -y
RUN yum install -y \
wget \
tar \
vim \
gcc-c++ \
make \
cmake \
openssl-devel
|
If you have built |
A will try to find any other solution to fix this using other OS image or using libpq++. Thanks for helping me. 😄 |
@ZhengLinLei to set an explicit C++ version, add this option to the |
@ZhengLinLei it looks like a very strange problem... I see some of the errors that you'd normally get when libpqxx and your application are compiled differently, or you're getting a different libpqxx version at link time than at compile time. But I also see much more basic link errors. Could the libpqxx binary you built be damaged somehow, or even missing from the install location? AFAIK it shouldn't matter but... What if you put the |
Using the avaliable package with yum (libpqxx v7.9.0) , the lib is installed in g++ -std=c++17 -Ih -I/usr/pgsql-14/include/ -I/usr/include/ -L/usr/pgsql-14/lib/ -L/usr/lib64/ -lpthread -lpqxx -lpq ../build/base_DB.o ../build/base_ServerComm.o ../build/main_RouteServer.o -o ../dist/OronetaCoreServer
As you see, I tried using the prebuilt package and same errors. It is very strange, I tried everything from internet and similar issues solutions, and nothing worked. Additional informationMakefile # Makefile C
# Directories
SRC_DIR = c
INC_DIR = -Ih -I/usr/pgsql-14/include/ -I/usr/include/
LINK_DIR = -L/usr/pgsql-14/lib/ -L/usr/lib64/
LIB_DIR = -lpqxx -lpq -lpthread
BUILD_DIR = ../build
DIST_DIR = ../dist
PROJECT_NAME = OronetaCoreServer
# Source code and object
SRCS = $(wildcard $(SRC_DIR)/*.cpp)
OBJS = $(patsubst $(SRC_DIR)/%.cpp,$(BUILD_DIR)/%.o,$(SRCS))
# Name of project
TARGET = $(DIST_DIR)/$(PROJECT_NAME)
# Compiler and options flag "no warning"
CC = g++
CFLAGS = -std=c++17 $(INC_DIR) $(LINK_DIR) $(LIB_DIR)
# Main executable program
all: $(TARGET)
# g++ --all
$(TARGET): $(OBJS)
@mkdir -p $(DIST_DIR)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
# g++ --code
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
@mkdir -p $(BUILD_DIR)
$(CC) $(CFLAGS) -c $< -o $@
# Regla para limpiar
clean:
rm -rf $(BUILD_DIR)/*.o $(TARGET) ../dist/*.tgz ../dist/*.tar
|
@ZhengLinLei If you specify -./configure --with-postgres-lib=/usr/pgsql-14/lib --with-postgres-include=/usr/pgsql-14/include
+./configure --with-postgres-lib=/usr/pgsql-14/lib --with-postgres-include=/usr/pgsql-14/include CXXFLAGS="-std=c++17"
make && make install And |
We've had a lot of trouble with prepackaged libraries in part because no packaging system out there seems to take differences in compiler, compiler version, and C++ version into account. So it's easy to end up with incompatible binaries. The other part is that the libpqxx exception class hierarchy had different ABIs depending on whether you compiled as C++17 or a newer version. And so you'd get link errors if you compiled the application and libpqxx as different C++ versions. But we changed that in 7.9.0. |
@ZhengLinLei any chance you could run I'd expect to see it defined. It's almost as if the libpqxx build itself isn't seeing the config header... |
In #828 we found that the real problem was a bad command line: in that case the compilation was done with |
I'm having troubles compiling my project. It shows undefined references error.
Information:
./configure --with-postgres-lib=/usr/pgsql-14/lib --with-postgres-include=/usr/pgsql-14/include make && make install
Problem
When I try to compile the project with:
I have this error:
The text was updated successfully, but these errors were encountered: