2013-04-14 1 views
15

예이 질문은 전에 질문되었습니다 ... 이전 답변에서 언급 한 모든 것을 시도했습니다. 내 설치가 정말 간단하므로 너무 열심히해서는 안됩니다.C++/mysql Connector - get_driver_instance에 대한 정의되지 않은 참조 - 이미 쉬운 작업을 시도했습니다.

저는 C++을 사용하여 mysql을 프로그래밍하려고합니다. 내 소스 코드는 여기에 '안녕하세요'형식의 예에서 verbatem을 가져온 것입니다

http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-examples-complete-example-1.html

우분투 12.10에입니다. 악명 높은 나에게주는

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0 -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn firsttry.cpp 

그것은 (내가 -c 옵션을 사용하는 경우) 컴파일하지만 구축되지 않습니다 :

/tmp/ccn768hj.o: In function `main': 
firsttry.cpp:(.text+0x3a): undefined reference to `get_driver_instance' 

몇 가지 세부 사항 :

  • 을 나는 노력하고 있어요 'firsttry.cpp' 그냥 소스 코드 파일을 명명 한 것입니다. 공식 예제에서 다시 축약했습니다.
  • 내가 볼 수있는 것처럼 mysqlclient 라이브러리 및 mysqlcppconn 라이브러리. 이 질문이 이전에 물어 보았을 때가 여러 번 있었지만 대답은 그것들을 연결하는 것이 었습니다.
  • 일부 다른 역사적 답변은 샘플 소스 코드가 잘못되었으며 해당 함수가 sql :: mysql 네임 스페이스 등에 있어야한다고 제안합니다. 소스 코드가 괜찮은지 확신합니다. 다시 말하지만, 컴파일되고, 소스 코드의 네임 스페이스를 변경하면 더 악화되는 것처럼 보입니다.

제공 할 수있는 도움에 대해 미리 감사드립니다.

+1

'-l 것이 무엇입니까? '-lmysqlclient_r'이 아니어야합니까? –

+0

감사합니다 Haroogan. 내가 그 - 난 : 사업에서 [링크] (http://stackoverflow.com/questions/335928/ld-cannot-find-an-existing-library) - 나는 그것이 전체 파일 이름을 지정하는 단지 방법이라고 생각 기존의 명명 스타일의 심볼릭 링크는 존재하지 않습니다. 그래서 -lmysqlclient_r을 시도하면 -lmysqlclient_r을 찾을 수 없다고 말했습니다. 여러분의 피드백에 따라 심볼릭 링크를 만들었습니다. 이제 -lmysqlclient_r을 사용할 수 있습니다. 그리고 get_driver_instance에 대한 동일한 오류가 발생합니다. 다른 생각? –

+0

먼저'firsttry.cpp'를'firsttry.o'로 컴파일하고, 그 파일들을 MySQL 라이브러리와 링크하여 실행 파일에 연결하십시오. 나는. 'g ++ -Wall -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0 -o firsttry.o firsttry.cpp' 그리고'g ++ firsttry.o -L/usr/lib/x86_64-linux-gnu -l : libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn -o firsttry'. –

답변

27

저는 이제 일주일 동안이 문제를 겪었습니다. 그래서 저는 그것에 대해서 매우 좌절했습니다. 방금 mysql에 로그인하는 것 외에는 아무것도하지 않는 프로그램을 마침내 만들 수 있었고 문자 그대로 기쁨으로 말했습니다. 여기에 내가 가진 것이 있으며 도움이되기를 바랍니다.

그때 바로 그것을 얻기 위해 적절한 사용, 그래서 내가 먼저 소스에서하지만 난 뭔가 잘못했다 생각 했을까 잠시 후 C++ 커넥터 라이브러리를 컴파일

: 여기

sudo apt-get install libmysqlcppconn-dev 

그리고 내 간단한 테스터 소스 파일입니다 "tester.cpp"

#include <stdlib.h> 
#include <iostream> 
#include <mysql_connection.h> 
#include <driver.h> 
#include <exception.h> 
#include <resultset.h> 
#include <statement.h> 

using namespace sql; 
int main(void){ 
    sql::Driver *driver; 
    sql::Connection *con; 

    driver = get_driver_instance(); 
    con = driver->connect("tcp://127.0.0.1:3306","root","YOURPASSWORD"); 

    return 0; 
} 

그리고 마지막으로 g ++ 컴파일 명령을

sudo g++ -Wall -I/usr/include/cppconn -o testapp tester.cpp -L/usr/lib -lmysqlcppconn 

이것은 저에게 효과적이었으며 문제 해결에 도움이되기를 바랍니다.

+1

네 - 그게 효과가 있어요! 놀랍습니다.특히, (A) 소스 코드에서 빌드하려고하거나 (당신을 위해 작동하지 않았거나) (B) MySQL 사이트에서 라이브러리를 다운로드하는 대신 apt-get install을 통해 라이브러리를 얻는 것이 었습니다. 그 (것)들 폴더에서 나 자신을두기 (저를 위해 일하지 않았다.) 순전히 감사하십시오! –

+0

이 질문이 해결되는 동안, 나는 처음부터 잘못하고있는 것에 대해 불타는 호기심으로 남아 있습니다. 내가 C++에서 약간 녹슬었고 리눅스에 익숙하지 않았기 때문에 이것은 진짜 newby 실수였다. 가장 좋은 추측은 디렉토리 위치와 관련이 있어야한다는 것입니다 ...'apt-get install'은 서브 디렉토리에있을 때 _mysqlcppconn_ 권한을/usr/lib의 루트에 두었습니다.하지만 괜찮지 않아야합니다. 제가 프로그램을 만들 때 전체 경로를 지정하는 한, 제가 어떤 프로그램 이었습니까? 컴파일 단계에서도 Boost 등을 지정할 필요가 있다고 말하고있었습니다. –

+0

훌륭한 해결책은 심지어 기존의 libmysqlcppconn-dev를 먼저 제거하고 나서 당신이 말한 것을 따라야합니다. 노력의 2 일 후에 gread가 작동합니다! 나는 mysql 사람들이 문서를 보관하고있는 것을 모른다. – Catty

8

간단히 말해서 마지막 두 인수의 순서를 바꾸면이 문제가 해결되었습니다. 이유는 모르지만 링커는 소스 파일 다음에 -lmysqlcppconn 옵션을 지정하면 함수 get_driver_instance을 찾을 수 있습니다.

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -L/usr/lib/mysqlcppconn firsttry.cpp -lmysqlcppconn 

또한 나는 그들이 모든 경로가 던져 PARAM의 -I를 포함하는 경우

-I/usr/local/boost_1_53_0 -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 
+0

당신의 솔루션은 나를 위해 일했습니다. 고마워요! – Purefan

+0

그래, 이건 나를 위해, 말 그대로 말 그대로 추가 플래그를 제거하지 않고 명령의 끝에 링크 플래그를 이동 설명 - 어떻게 이해합니까? – Brizee

1

중복 생각하는 나는 다음과 같은 옵션을 꺼내서 있습니다.

g++ -g -o0 -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o 
g++ -g -o0 -L/usr/local/lib -L/usr/local/mysql/lib -lmysqlcppconn main.o -o test 

문제가 나타납니다 :

g++ -g -o0 -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o 
g++ -g -o0 -L/usr/local/lib -L/usr/local/mysql/lib main.o -o test -lmysqlcppconn 
:

main.o: In function `main': 
/home/huangxw/workspace/public/soal/test/main.cpp:165: undefined reference to `get_driver_instance' 
collect2: ld returned 1 exit status 

지금 당신이 -lmysqlcppconnmain.o의 순서를 조정해야합니다 당신은 당신이 이런 식으로 컴파일하는 경우 문제가 있는지 여부를 확인 것

그게 다 !! 이유는 간단합니다. 너는 웹을 사용하여 알아 내거나 정교하게 묻는다. 경우

+0

두 가지 문제를 혼동합니다. 1) 왜 이것이 차이를 만들고 2) 어떻게 autotools/automake를 사용하여 "main.o"이후에 오는지를 지정해야합니까? – Discordanian

4

당신은 나처럼 건망증이 있고 CMakeLists.txt에 라이브러리를 연결하지 않았다 libmysqlclient_r.so.18` :

target_link_libraries(<target> mysqlcppconn) 
+1

안녕하세요, ''이 무엇입니까? 나는 또한 CMakeLists.txt를 사용하고 있으며, 당신의 답은 저를 구할 수있는 가장 가능성있는 답입니다. –

+0

대상은 add_executable (myproj) 다음에 사용한 이름입니다. 이 경우에는 myproj입니다. https://schneide.wordpress.com/2016/04/08/modern-cmake-with-target_link_libraries/ – user584583

+0

http://osdevlab.blogspot.com/2016/02/how-to-install-mysql-connectorc-on .html – user584583