Hi !
I’m trying to build an old project made with juce 4.1 using cmake 3.0 and gcc 4.8.
I successfully compile Juce as a static library.
The building of my project works well except the linking process, I got libjuce.a(juce_events_79b2840.o): undefined reference to symbol «XrmUniqueQuark» /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libX11.so: error adding symbols: DSO missing from command line
.
Which library am I missing to include in my linking command line ?
I’ve tried adding -lX11 but it didn’t work.
Thanks.
ANSWER -> post 7 : Unable to link against juce as XrmUniqueQuark symbol is not found
jules
May 14, 2018, 9:56am
2
No idea… We don’t use that symbol anywhere in JUCE. Even searching the whole of juce for “xrm” gives no results, so you’d have to figure out yourself where it comes from, I’m afraid!
fatmax
May 14, 2018, 10:05am
3
Ooh ooh
My project uses QT.
It’s weird because the error points to the libjuce.a which is just static compiled Juce’s source code.
fatmax
May 14, 2018, 10:45am
4
grep -rnw -e 'XrmUniqueQuark'
binary file juce_events_79b2840.o matching
binary file libjuce.a matching
readelf -Ws libjuce.a | grep Xrm
2455: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND XrmUniqueQuark
The XrmUniqueQuark
is a function declared in <X11/Xresource.h>
which is used in juce_events.cpp :
#elif JUCE_LINUX
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
#undef KeyPress
#include <unistd.h>
#endif
The man entry fro XrmUniqueQuark
says :
The XrmUniqueQuark function allocates a quark that is guaranteed not to represent any string that is known to the resource manager.
The juce Makefile I’m using which compiles fine:
# (this disables dependency generation if multiple architectures are set)
DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)
ifndef CONFIG
CONFIG=Debug
endif
ifeq ($(CONFIG),Debug)
BINDIR := build
LIBDIR := build
OBJDIR := build/intermediate/Debug
OUTDIR := build
ifeq ($(TARGET_ARCH),)
TARGET_ARCH := -march=native
endif
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
CXXFLAGS += $(CFLAGS) -std=c++11
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/lib/x86_64-linux-gnu/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt
TARGET := libjuce.a
BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS)
CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)
endif
ifeq ($(CONFIG),Release)
BINDIR := build
LIBDIR := build
OBJDIR := build/intermediate/Release
OUTDIR := build
ifeq ($(TARGET_ARCH),)
TARGET_ARCH := -march=native
endif
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
CXXFLAGS += $(CFLAGS) -std=c++11
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/lib/x86_64-linux-gnu/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt
TARGET := libjuce.a
BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS)
CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)
endif
OBJECTS := \
$(OBJDIR)/juce_audio_basics_2442e4ea.o \
$(OBJDIR)/juce_audio_devices_a4c8a728.o \
$(OBJDIR)/juce_audio_formats_d349f0c8.o \
$(OBJDIR)/juce_audio_processors_44a134a2.o \
$(OBJDIR)/juce_audio_utils_f63b12e8.o \
$(OBJDIR)/juce_core_aff681cc.o \
$(OBJDIR)/juce_data_structures_bdd6d488.o \
$(OBJDIR)/juce_events_79b2840.o \
$(OBJDIR)/juce_graphics_c8f1e7a4.o \
$(OBJDIR)/juce_gui_basics_a630dd20.o \
$(OBJDIR)/juce_gui_extra_7767d6a8.o \
.PHONY: clean
$(OUTDIR)/$(TARGET): $(OBJECTS) $(RESOURCES)
@echo Linking juce
-@mkdir -p $(BINDIR)
-@mkdir -p $(LIBDIR)
-@mkdir -p $(OUTDIR)
@$(BLDCMD)
clean:
@echo Cleaning juce
@$(CLEANCMD)
strip:
@echo Stripping juce
-@strip --strip-unneeded $(OUTDIR)/$(TARGET)
$(OBJDIR)/juce_audio_basics_2442e4ea.o: ../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_audio_basics.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_audio_devices_a4c8a728.o: ../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_audio_devices.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_audio_formats_d349f0c8.o: ../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_audio_formats.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_audio_processors_44a134a2.o: ../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_audio_processors.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_audio_utils_f63b12e8.o: ../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_audio_utils.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_core_aff681cc.o: ../../JuceLibraryCode/modules/juce_core/juce_core.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_core.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_data_structures_bdd6d488.o: ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_data_structures.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_events_79b2840.o: ../../JuceLibraryCode/modules/juce_events/juce_events.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_events.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_graphics_c8f1e7a4.o: ../../JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_graphics.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_gui_basics_a630dd20.o: ../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_gui_basics.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
$(OBJDIR)/juce_gui_extra_7767d6a8.o: ../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling juce_gui_extra.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-include $(OBJECTS:%.o=%.d)
The /usr/lib/x86_64-linux-gnu/ folder contains libX11.so.
jules
May 14, 2018, 2:28pm
6
If you just do a standard juce build of e.g. the juce demos or other example code, then I’m assuming that works OK?
-lX11
was effectively needed for linking.
Prefer the CMAKE way of doing it:
FIND_PACKAGE(X11 REQUIRED)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} juce ${X11_LIBRARIES})
As it’s not the first time I encounter such embarrassment I should probably make a tuto about how to compile and link juce with an user’s project.