![]() |
|
||||||||||||
| Linux
Code Development |
unless otherwise noted the following material has been gleaned from the use of redhat 5.X/6.0 Linux distributions
|
|
The work around is to make sure the C++ file uses prototypes with the magical extern "C" keyword. For instance ...
Now this work around needs a bit more finesse to keep classic C compilers from choking. Most C++ compilers #define __cplusplus only when compiling a C++ file. To keep your prototypes C compatible try something like this ...
# testapp makefile
#
# common files
# |-include
# | |-base
# | |-graphics
# | `-io
# |-src
# | |-base
# | |-gfx
# | `-io
# `-apps
# `-testapp
# `-objects
TARGET = testapp
CPP = g++
CPP_PROJ = -c -gstabs+
INCLUDE = -I../../include -I../../include/base -I../../include/graphics -I../../include/io
LDFLAGS =
LIBS = -lMesaGL -lMesaGLU -L/usr/X11R6/lib -lX11 -lXext -lXmu -lXt -lXi -lSM -lICE -lm
OBJDIR = objects
OBJS_IO = \
$(OBJDIR)/io1.o \
$(OBJDIR)/io2.o \
$(OBJDIR)/io3.o
OBJS_GFX= \
$(OBJDIR)/gfx1.o \
$(OBJDIR)/gfx2.o
OBJS_BASE= \
$(OBJDIR)/base1.o \
$(OBJDIR)/base2.o \
$(OBJDIR)/base3.o \
$(OBJDIR)/base4.o
$(TARGET): $(OBJDIR)/$(TARGET).o $(OBJS_BASE) $(OBJS_IO) $(OBJS_GFX)
$(CPP) -gstabs+ -o $@ $< $(OBJS_BASE) $(OBJS_IO) $(OBJS_GFX) $(LIBS)
$(OBJS_BASE): $(wildcard ../../src/base/*.cpp)
$(CPP) $(CPP_PROJ) $(INCLUDE) -o $@ ../../src/base/$(*F).cpp
$(OBJS_IO): $(wildcard ../../src/io/*.cpp)
$(CPP) $(CPP_PROJ) $(INCLUDE) -o $@ ../../irc/io/$(*F).cpp
$(OBJS_GFX): $(wildcard ../../src/gfx/*.cpp)
$(CPP) $(CPP_PROJ) $(INCLUDE) -o $@ ../../src/gfx/$(*F).cpp
$(OBJDIR)/$(TARGET).o: $(TARGET).cpp
$(CPP) $(CPP_PROJ) $(INCLUDE) -o $@ $<
clean:
rm -f $(OBJDIR)/*.o
rm -f $(TARGET)
# ismogl*.a - DISM OpenGL static library
# changes:
# Jan 11, 2000 - replaced ismwinapp.o with x11app.o
TARGET = ismogld.a
INC_CORE = ../../inc
DIR_CORE = ../../ismsrc/core
DIR_OGL = ../../ismsrc/ogl
DIR_PLUGINS = ../../ismsrc/plugins
OBJDIR = objects
LIBDIR = ../../libs/linux
CPP = g++
CPP_PROJ = -c -gstabs+ -DFREDWINOFF -DDISMBAD_BYPASS_OFF -DX11_LINUX
#CXXFLAGS = -D_DEBUG -DISM_NOTHREAD -DISM_NOTEX -DISM_OGL
CXXFLAGS = -D_DEBUG -DISM_NOTHREAD -DISM_OGL
INCLUDE = -I$(INC_CORE) -I$(INC_CORE)/plugins -I$(INC_CORE)/ogl
OBJS_OGL = \
$(OBJDIR)/appgl.o \
$(OBJDIR)/surfgl.o \
$(OBJDIR)/lightgl.o \
$(OBJDIR)/meshgl.o \
$(OBJDIR)/glprim.o \
$(OBJDIR)/imagegl.o \
$(OBJDIR)/newscene.o \
$(OBJDIR)/camgl.o
OBJS_PLUGINS = \
$(OBJDIR)/bb.o \
$(OBJDIR)/imageswitch.o \
$(OBJDIR)/keyframe.o \
$(OBJDIR)/lod.o \
$(OBJDIR)/pathplay.o \
$(OBJDIR)/portal.o \
$(OBJDIR)/room.o \
$(OBJDIR)/roomgroup.o \
$(OBJDIR)/sprite.o \
$(OBJDIR)/switch.o \
$(OBJDIR)/switcher.o \
$(OBJDIR)/texswitcher.o \
$(OBJDIR)/wall.o \
$(OBJDIR)/xformer.o
OBJS_CORE = \
$(OBJDIR)/appearbase.o \
$(OBJDIR)/array.o \
$(OBJDIR)/box.o \
$(OBJDIR)/cam.o \
$(OBJDIR)/engine.o \
$(OBJDIR)/fog.o \
$(OBJDIR)/geodraw.o \
$(OBJDIR)/geonorm.o \
$(OBJDIR)/geoutil.o \
$(OBJDIR)/geomesh.o \
$(OBJDIR)/group.o \
$(OBJDIR)/image.o \
$(OBJDIR)/ismapp.o \
$(OBJDIR)/ismpool.o \
$(OBJDIR)/ismbufpool.o \
$(OBJDIR)/ismprim.o \
$(OBJDIR)/x11app.o \
$(OBJDIR)/light.o \
$(OBJDIR)/lightdev.o \
$(OBJDIR)/loadq.o \
$(OBJDIR)/mat.o \
$(OBJDIR)/cmatrix.o \
$(OBJDIR)/model.o \
$(OBJDIR)/multitex.o \
$(OBJDIR)/obj.o \
$(OBJDIR)/quat.o \
$(OBJDIR)/scene.o \
$(OBJDIR)/scenethread.o \
$(OBJDIR)/shape.o \
$(OBJDIR)/sphere3.o \
$(OBJDIR)/memstream.o \
$(OBJDIR)/stream.o \
$(OBJDIR)/string.o \
$(OBJDIR)/surf.o \
$(OBJDIR)/trimesh.o \
$(OBJDIR)/vtxaos.o \
$(OBJDIR)/vtxbase.o
# collect all the object files into a library archive
$(LIBDIR)/$(TARGET): $(LIBDIR) $(OBJDIR) $(OBJS_CORE) $(OBJS_PLUGINS) $(OBJS_OGL)
ar -rs $@ $(OBJS_CORE) $(OBJS_PLUGINS) $(OBJS_OGL)
# compile DISM OpenGL files
$(OBJDIR)/%.o: $(DIR_OGL)/%.cpp
$(CPP) $(CPP_PROJ) $(CXXFLAGS) $(INCLUDE) -o $@ $<
# compile DISM plugin files
$(OBJDIR)/%.o: $(DIR_PLUGINS)/%.cpp
$(CPP) $(CPP_PROJ) $(CXXFLAGS) $(INCLUDE) -o $@ $<
# compile the core DISM common files
$(OBJDIR)/%.o: $(DIR_CORE)/%.cpp
$(CPP) $(CPP_PROJ) $(CXXFLAGS) $(INCLUDE) -o $@ $<
#$(OBJDIR)/%.o: %.cpp
# $(CPP) $(CPP_PROJ) $(CXXFLAGS) $(INCLUDE) -o $@ $<
$(OBJDIR)/%.o: %.c
$(CPP) $(CPP_PROJ) $(CXXFLAGS) $(INCLUDE) -o $@ $<
$(LIBDIR):
@mkdir -p $(LIBDIR)
$(OBJDIR):
@mkdir -p $(OBJDIR)
clean:
rm -fR $(OBJDIR)
rm -f *.o
rm -f $(LIBDIR)/$(TARGET)
ogl:
rm -fR $(OBJS_OGL)
Building Shared Libraries
ELF shared libraries To build libfoo.so as a shared library, the basic steps look like this: $ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o $ ln -s libfoo.so.1.0 libfoo.so.1 $ ln -s libfoo.so.1 libfoo.so $ LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH This will generate a shared library called libfoo.so.1.0, and the appropriate links for ld (libfoo.so) and the dynamic loader (libfoo.so.1) to find it. To test, we add the current directory to LD_LIBRARY_PATH tip thanks to Richard Schaal - Intel
Setup for OpenGL & Motif/Lesstif Development
tested with RedHat 6.1
Get Mesa3.1 make linux ... cp *.so ... ld config offset will run cp -R include/GL /usr/include offset will build cp -R widgets-mesa/include/GL /usr/include Get GLUT 3.6 build *.so cp *.so ... ldconfig glpng/test will run cp include/glut.h glpng/test will build Get Lesstf-0.89.9 cd lib make ... cp *.so ldconfig glw & molview will run cp include/Xm glw & molview will build Note: may need to replace references of ... GLwMDrawA.h -> GLwDrawA.h glwMDrawingAreaWidgetClass -> glwDrawingAreaWidgetClass
GBM Library
This is a nice library that can be used to read all those nasty proprietary
image formats that are not covered by more standardzed image libraies for
PNG or JPEG . Precompiled binaries for Linux available online seem to have
hard coded reference to mysterious foreign libraries. The source is
also available onlin, but compiling it for Linux will generate a gbm.a
library with mysterious referecnes to tell and
spr_rhdr that wil prevent it from linking with application code.
Get the source code
The Linux makefile should already be in the main directory. To be
sure though
cp unix/* .
edit gbm.c
find the text that looks like this ...
iax_qft, iax_rhdr, iax_rpal, iax_rdata, iax_w, iax_err,
xbm_qft, xbm_rhdr, xbm_rpal, xbm_rdata, xbm_w, xbm_err,
/* spr_qft, spr_rhdr, spr_rpal, spr_rdata, spr_w, spr_err, */
psg_qft, psg_rhdr, psg_rpal, psg_rdata, psg_w, psg_err,
gem_qft, gem_rhdr, gem_rpal, gem_rdata, gem_w, gem_err,
... and insure a comment is made as shown.
now edit makefile
locate the first reference to gbmspr.o delete it
now make should build a gbm.a and the other command line utilities
without complaint. I suspect that some sprite file format support
is gutted by this hack. Hopefully a better online binary and source will
make this hack obsolete.
$ cat makelc
# renaming $1 with all lowercase
mlv $1 > $1.junk
chmod 700 ./$1.junk
./$1.junk
rm -f ./$1.junk
$ ls Test
test1.BMP test2.BMP test3.BMP
$find -name "*.BMP" -exec ./makelc {} \;
mv ./Test/test3.BMP ./Test/test3.bmp
mv ./Test/test2.BMP ./Test/test2.bmp
mv ./Test/test1.BMP ./Test/test1.bmp/* mlv - generate script output to rename mixed case filenames to all lowercase
/*
/* $ cc mlv.c -o mlv
/*
/* Note: filenames that include whitespace will freak
*/
int main(int argc, char *argv[]) {
int i, j, k;
if (argc < 2) {
printf("echo mlv [file to rename in all lowercase]\n");
return;
}
printf("mv ");
printf("%s", argv[1]);
k = strlen(argv[1]);
i = 0;
for (j = 0; j < k; j++) {
if (argv[1][j] == '/')
i++;
}
for (j = 0; j < k; j++) {
if (argv[1][j] == '/')
i--;
if (i == 0)
argv[1][j] = tolower(argv[1][j]);
/* replace with isupper() if uppercase is what you want */
}
printf(" %s\n", argv[1]);
}
boot: 'nosmp' will force multi-CPU system to use single CPU kernal