Comments (17)
Similar issue #732
This may be due to different compile-time options, especially the -std=<CXX_VERSION>
flag.
Do you know what the options are when you run the make
command?
from libpqxx.
It use by default C++17 for the compilation. Also I tried changing it to C++20 but doesn't work.
from libpqxx.
If the compile options match, then there may be another version libpqxx installed on the machine and the linker links to it.
from libpqxx.
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
from libpqxx.
Is the default compiler for that Docker image g++
? If not, libpqxx may be built with a different compiler unless you specify the compiler by CXX
environment variable.
from libpqxx.
Yes, the default compiler is g++. By the way I tried compiling with prebuilt libpqxx with yum, and I got fewer errors.
6.625 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
6.821 /usr/bin/ld: ../build/base_DB.o: in function `pqxx::internal::(anonymous namespace)::throw_for_encoding_error(char const*, char const*, unsigned long, unsigned long)':
6.822 base_DB.cpp:(.text+0x1ab): undefined reference to `pqxx::argument_error::argument_error(std::string const&)'
6.822 /usr/bin/ld: ../build/base_DB.o: in function `__static_initialization_and_destruction_0(int, int)':
6.822 base_DB.cpp:(.text+0x4d1): undefined reference to `pqxx::internal::demangle_type_name(char const*)'
6.822 /usr/bin/ld: base_DB.cpp:(.text+0x4ff): undefined reference to `pqxx::internal::demangle_type_name(char const*)'
6.822 /usr/bin/ld: base_DB.cpp:(.text+0x52d): undefined reference to `pqxx::internal::demangle_type_name(char const*)'
6.822 /usr/bin/ld: base_DB.cpp:(.text+0x55b): undefined reference to `pqxx::internal::demangle_type_name(char const*)'
from libpqxx.
Are object files ( base_DB.o
, base_ServerComm.o
...) built with the same image?
And what happens by adding RUN dnf group install -y "Development Tools"
to the Dockerfile
?
from libpqxx.
Are object files (
base_DB.o
,base_ServerComm.o
...) built with the same image?
Yes.
And what happens by adding
RUN dnf group install -y "Development Tools"
to theDockerfile
?
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
from libpqxx.
If you have built base_DB.o
and others with the same compile options as libpqxx, there should be no logical reason for a link error due to undefined reference
.
The missing symbols must either be due to different mangle rules or different compilation options, but I can't think of a better cause.
from libpqxx.
A will try to find any other solution to fix this using other OS image or using libpq++. Thanks for helping me. 😄
from libpqxx.
@ZhengLinLei to set an explicit C++ version, add this option to the configure
command line: CXXFLAGS=-std=c++17
(for C++17), or CXXFLAGS=-std=c++20
(for C++20), etc.
from libpqxx.
@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 -lpqxx -lpq -lpthread
on the command line after your own object files?
from libpqxx.
@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.
Using the avaliable package with yum (libpqxx v7.9.0) , the lib is installed in /usr/lib64
and the headers in /usr/include
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
Could the libpqxx binary you built be damaged somehow, or even missing from the install location?
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 information
Makefile
# 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
from libpqxx.
@ZhengLinLei If you specify CFLAGS = -std=c++17
in your project, you must specify -std=c++17
when building libpqxx.
-./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 CC
and CFLAGS
are variables used for the C compiler.
When compiling C++, you should use CXX
and CXXFLAGS
.
Otherwise you will encounter strange errors.
See also: https://stackoverflow.com/questions/5541946/cflags-ccflags-cxxflags-what-exactly-do-these-variables-control
from libpqxx.
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.
from libpqxx.
Related Issues (20)
- [Build failure] undefined reference to `pqxx::argument_error::argument_error` HOT 7
- have libpqxx subscribe to a channel HOT 4
- subscribing to two trigger channels HOT 4
- Receiving false positive signals through conn.await_notification() HOT 2
- Converting TIMESTAMP datatypes into a std::chrono::time_point HOT 8
- Docs gone since 7.9 HOT 19
- Error building a project with the library HOT 8
- Building with bazel error: "ar: libdeps specified more than once" or "undefined reference to PQ" HOT 7
- Make of libpqxx on Red Hat Enterprise Linux 8.8 fails HOT 6
- PQXX_DECLARE_ENUM_CONVERSION issues HOT 15
- G++ Vcpkg Debian Docker image linker errors HOT 18
- Query streaming doesn't compile anymore HOT 3
- Can't initialize zview from string_view HOT 2
- Missing cast opportunity HOT 17
- cmake will take the given lib name and it changes to "-l{libname}" and linker will search using "-l{libname}" HOT 7
- `RETURNING` from a `stream_to` HOT 3
- Failure on streaming a list of empty strings HOT 6
- Conversion of TEXT[] to std::vector<std::string>. HOT 5
- error C2039: 'converts_from_string': is not a member of 'pqxx::string_traits<pgvector::Vector>' HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from libpqxx.