부록 E. 전처리기기 FAQ#
C/C++ 전처리기 관련 FAQ#
질문: insert 시에 이상한 값이 입력됩니다.#
C/C++ 전처리기를 사용하여 만든 애플리케이션에서 데이터 생성 후에 생성된 내용을 테이블에 입력할 때 이상한 값이 입력됩니다.
답변#
C/C++ 전처리기로 프로그램 시에 주의 사항으로 호스트 변수는 지역 또는 전역 변수로 적절히 사용해야 합니다. 호스트 변수 선언이 제대로 되어 있는지 확인하세요.
Compiler 관련 FAQ#
질문: HP-UX에서 라이브러리 링크시 에러가 발생했습니다.#
HP-UX에서 라이브러리를 링크할 때 에러가 발생했습니다.
사용한 c compiler 옵션은 다음과 같습니다.
$ cc +DA2.0W -I../include -I/user1/altibase/altibase_home/include/ -I/user1/asn1/include -Ae -D_REENTRANT -DOAM -DSRC_LINE -DDEBUG -DDETAIL_DEBUG -g -c dbinit.c
이후에 만들어진 object 파일들을 다음과 같이 링크했습니다.
$ cc +DA2.0W -o MKTDBD dbfunc.o main.o util.o dbif.o shm_msg.o file.o dbinit.o dbresult.o -L/user1/altibase/altibase_home/lib -L/user1/main/KTSLEE/lib -lcom -lprice.1.1.0 -lodbccli -lsesc -lxti -lpthread -lrt -ldld
답변#
실행결과를 보니 link시 C++ 컴파일러가 아니고 C 컴파일러를 사용한 거 같습니다.
C++컴파일러를 사용하면 시스템 라이브러리가 자동으로 추가되어 컴파일이 되고 링크도 됩니다. 하지만 C컴파일러를 사용하면 링크할 때 아래와 같이 시스템 라이브러리도 추가 하여야 합니다.
LIBS += -ldl -lstd -lstream -lCsup -lm -lcl -lc
따라서 보내주신 내용 중에서 링크부분이 다음과 같이 바뀌어야 합니다.
$ cc +DA2.0W -o MKTDBD dbfunc.o main.o util.o dbif.o shm_msg.o file.o dbinit.o dbresult.o -L/user1/altibase/altibase_home/lib -L/user1/main/KTSLEE/lib -lcom -lprice.1.1.0 -lodbccli -lsesc -lxti -lpthread -lrt -ldld -ldl -lstd -lstream -lCsup -lm -lcl -lc
$ cc +DA2.0W -o MKTDBD dbfunc.o main.o util.o dbif.o shm_msg.o file.o dbinit.o dbresult.o -L/user1/altibase/altibase_home/lib -L/user1/main/KTSLEE/lib -lcom -lprice.1.1.0 -lodbccli -lsesc -lxti -lpthread -lrt -ldld
질문: 인증서버에 설치된 MMDB의 데이터를 다른 장비로부터 조회할 때, 실행 모듈은 어느 장비에서 빌드하는 게 좋을까요?#
다른 기타 서버가 인증서버의 MMDB의 데이타 쿼리를 하기 위해서 기타 서버에 C/C++ 전처리기로 작성된 application으로 인증서버에 access하는 걸로 알고 있는데요... 그럼 기타 다른 서버에 C/C++ 전처리기가 존재해서 각 서버에서 독자적인 실행모듈을 만들어야 하나요? 아니면 라이브러리를 인증서버에서 만들어서.... 각 서버에 배포해서 그걸 link해서 실행파일을 만드는 경우인데요.... 첫 번째 경우는 인증서버에 access하는 각 서버마다 C/C++ 전처리기가 존재해야 되는 문제점이 있지 않나 해서요... 관리적인 측면에서도 불편하구요... 두 번 째 경우에는 라이브러리를 만들어서 배포할 경우, 그 걸 link시켜 각 서버단(장비, OS 틀림)에서 compile을 할 경우 문제가 없는지 가 궁금합니다... 답변 좀 부탁드리구요.. .다른 사이트에서 어떤 방식으로 하는지도 궁금합니다.
makefile예제도 좀 부탁 드리겠습니다.
답변#
OS가 틀리면 어쩔 수 없이 Altibase Client module(Compile, Link를 하기 위한 module)이 깔려야 할 것 같습니다. 일반적으로는 OS가 같기 때문에 compiler machine or 표준 machine에서 compile하여서 다른 server들로 실행 module만 copy하는 것으로 알고 있습니다. OS가 다르면 반드시 그 machine에서 link를 하여야 합니다. (system library를 참조함).
makefile은 아래와 같은데 link할 때 libapre.a와 libodbccli를 저희가 제공합니다. 그리고 기본적인 사항들은 altibase_env.mk에서 저희가 모두 제공합니다.
질문: 컴파일 오류가 발생했습니다.#
간단한 소스를 테스트 하다가 Compile에 문제가 발생되었습니다.
C++ 표준 IO 부분에서 Altibase와 g++ 이 충돌하는 것 같습니다.
답변#
gcc로 컴파일 할 때의 예제는 다음과 같습니다.
$ apre -t cpp conn.sc
$ g++ -W -Wall -Wpointer-arith -pipe -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT -fno-implicit-templates -fno-exceptions -fcheck-new -I${ALTIBASE_HOME}/include -I. -c -o conn.o conn.cpp
$ g++ -W -Wall -Wpointer-arith -pipe -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT -fno-implicit-templates -fno-exceptions -fcheck-new -I${ALTIBASE_HOME}/include -I. -c -o main.o main.cpp
$ g++ -L. -L${ALTIBASE_HOME}/lib -o conn main.o conn.o -lapre -lodbccli -lstdc++ -lsocket -ldl -lnsl -lgen -lposix4 -lkvm -lkstat -lthread -lpthread
질문: 아래 makefile에서 뭐가 잘 못 된 걸까요?#
makefile을 다음과 같이 만들었는데 제대로 동작을 안 합니다.
#include $(ALTIBASE_HOME)/install/altibase_env.mk
COMPILE.c = /bin/cc +DA2.0W +DS2.0W -DPDL_NDEBUG
CC_OUTPUT_FLAG = -c
LD = /opt/aCC/bin/aCC
LFLAGS = -L. +DA2.0W +DS2.0W -Wl,+vnocompatwarnings -L$(ALTIBASE_HOME)/lib
GOPT =
INCLUDES = -I$(ALTIBASE_HOME)/include -I.
LIBDIRS = -L$(ALTIBASE_HOME)/lib
LIBS=-lxti -lpthread -lrt -ldld
SRCS=
OBJS=$(SRCS:.cpp=.o)
BINS=altitest
SESC=altitest.c
SOBJS=$(SESS:.cpp=.o)
%.o: %.c
$(COMPILE.c) $(INCLUDES) $(CC_OUTPUT_FLAG) $@ $<
%.c : %.sc
APRE $<
all: $(BINS)
altitest: altitest.o altitest.c
$(LD) $(LFLAGS) $(GOPT) $(INCLUDES) -o $@ altitest.o -lsesc -lodbccli $(LIBS)
clean:
-rm $(BINS) $(apre) *.o core *.class
답변#
%.c : %.sc
apre $<
위에서 보인 것처럼 대문자 APRE를 apre로 고쳐주세요.
질문: 링크가 안 되요.#
precompile은 잘 되는데, object들을 linking하는데 다음과 같은 오류가 납니다.
$ cc +DA2.0W -o MKTDBD dbfunc.o main.o util.o dbif.o shm_msg.o file.o dbinit.o dbresult.o -L/user1/altibase/altibase_home/lib -L/user1/main/KTSLEE/lib -lcom -lprice.1.1.4 -lodbccli -lapre -lxti -lpthread -lrt -ldld -ldl -lstd -lstream -
lCsup -lm -lcl -lc
ld: Unsatisfied symbol "SESStmtCount" in file /user1/altibase/altibase_home/lib/libsesc.a[sesSqlcli.o]
1 errors.
*** Error exit code 1
Stop.
host는 HP L class 이고, HP-UX 11.0 이 올라가 있습니다.
답변#
-lodbccli와 -lapre의 링크 순서를 바꾸시면 됩니다.