2015-01-28 4 views
2

sqlite3을 사용하는 C++ 프로그램을 컴파일하려고합니다.C++ 컴파일 문제, sqlite3

CXX = g++ 
CC = gcc 
CFLAGS = -c -O2 
CXXFLAGS = -Wall -O3 -std=c++11 
SQLFLAGS = -DSQLITE_THREADSAFE=0 

OUTPUTBIN = bot 
OUTPUTDIR = ./bin/ 
MKDIR = mkdir -p $(OUTPUTDIR) 
OBJECTC = sqlite3.o 
CSOURCES = sqlite3.c 
CXXSOURCES = main.cpp bot.cpp 


all: project 

project: createdir sql compilecpp 


createdir: 
    $(MKDIR) 

sql: 
    $(CC) $(CSOURCES) $(SQLFLAGS) $(CFLAGS) -o $(OUTPUTDIR)$(OBJECTC) 

compilecpp: 
    $(CXX) $(OUTPUTDIR)$(OBJECTC) $(CXXSOURCES) $(CXXFLAGS) -o $(OUTPUTDIR)$(OUTPUTBIN) 

을하지만 이러한 오류를 출력합니다 :이 메이크 파일을 사용하고

[email protected] ~/Documents/Proletarian/c++ $ make 
mkdir -p ./bin/ 
gcc sqlite3.c -DSQLITE_THREADSAFE=0 -c -O2 -o ./bin/sqlite3.o 
g++ ./bin/sqlite3.o main.cpp bot.cpp -Wall -O3 -std=c++11 -o ./bin/bot 
./bin/sqlite3.o: In function `unixDlError': 
sqlite3.c:(.text+0x170f4): undefined reference to `dlerror' 
./bin/sqlite3.o: In function `unixDlClose': 
sqlite3.c:(.text+0x5de9): undefined reference to `dlclose' 
./bin/sqlite3.o: In function `unixDlSym': 
sqlite3.c:(.text+0x5e01): undefined reference to `dlsym' 
./bin/sqlite3.o: In function `unixDlOpen': 
sqlite3.c:(.text+0x5e21): undefined reference to `dlopen' 
collect2: error: ld returned 1 exit status 
make: *** [compilecpp] Error 1 

나는이 원인을 무엇으로 매우 혼란 스러워요. 나는 sqlite3가 C 프로그램임을 알 수있다.하지만 문제가 발생할 것이라고 생각하지는 않는다.

+0

추가'당신의 링커 명령 행에 -ldl'. –

+0

인터넷 검색 'dlerror undefined symbol'은 첫 번째 조회수로 http://stackoverflow.com/questions/956640/linux-c-error-undefined-reference-to-dlopen을 반환합니다. – CiaPan

+0

둘 다 감사합니다. @CiaPan도이 사실을 발견했으나, 제 메이크 파일에 추가하는 방법이나 내 문제와 관련이 있는지는 확실하지 않았습니다. 저는 C++을 처음 접했으므로 다른 어떤 것보다 더 많은 문제가 될 것입니다. –

답변

4

오류 메시지는 dlerror, dlclose, dlsymdlopen가 사용되지만를 찾을 수 없음을 말한다. 이러한 함수는 동적 링크 로더의 일부입니다. 동적 링커도 연결해야합니다. 링크 플래그에 -ldl을 추가하십시오. 사용자 시스템의 경우 dlopen manpage을 참조하십시오.

+0

완벽 해 보인다. 방금 읽었다. 고마워. 유일한 것은 makefile에 무엇을 넣을 지 모르겠습니다. 그리고 그것을 어디에 두는 것이 중요합니까? 나는 makefiles에 익숙하다. 고통 스럽다. –

+0

쉬운 일은 compilecpp 대상에서 CXX 호출에 추가하는 것이고, Makefile은 개선의 여지가 많이있다. 그래도 모범 사례가 있습니다.) – johannes

+0

완벽한, 감사합니다. 내가 실수로 SQL 함께 넣어. 나는 어떤 것보다 더 많은 잠을 필요로하는 것처럼 본다! –

0

약간 늦었지만 - 가장 간단한 메이크 :

all: sqlite3 

sqlite3: sqlite3.o shell.o 
    gcc sqlite3.o shell.o -lpthread -ldl -o sqlite3 

sqlite3.o: sqlite3.c sqlite3.h 
    gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o 

shell.o: shell.c 
    gcc -c shell.c -lpthread -o shell.o 

clean: 
    rm *.o 
    rm sqlite3