2012-12-24 3 views
1

저는 Gwan에게 소용돌이를주고 있습니다.g-wan :/csp 밖에있는 건물 라이브러리 및 g ++ 컴파일 문제

예제 코드를 작성한 후에 필자는 하나 이상의 소스 파일로 작은 프로젝트를 시작했습니다. 내가 서버 시작시 연결 오류가 발생했습니다

  1. :

    가 연결 MAIN.CPP : 정의되지 않은 기호 : _ZN7GwanUrl9concatAllEv이

(주 파일이 두 #include를 지금이 문제가 다른 파일, 모든 파일은 csp 디렉토리에 있음)

  1. 모든 f ile을/csp 디렉토리에 넣었 으면 gwan 기능을 사용하면서/csp 디렉토리 외부에 라이브러리를 만들고 싶습니다. 슬프게도, 오류 톤이 뒤 따릅니다 - G-WAN 시작을 통하지 않고 커맨드 라인에서 GCC가 나올 때. Xbufstream.cpp 10, : 10 : 파일에서

    는 /home/ec2-user/gwan/include/gwan.h:22, 에서 Xbufstream.h에서 포함 /usr/include/time.h을 : 199 : 오류 : 'size_t로'유형 .....

누구든지 외무성 부상 g ++ 인수 문자열이 어떻게 생겼는지 알고 이름을하지 않는 이유는 무엇입니까?

은 (홀수 1. 에디터에서의 1. 2. 1.)

+0

아직받지 못하고 있습니다. G-WAN 기호를 사용하고 싶습니다. 예를 들어, 내가하고 싶은 말은 : 'Xbufstream & Xbufstream :: operator << (const char & c) { \t xbuf_xcat (xbuffer, "% c", c); \t return * this; }' –

답변

1

첫째,이 링커 문제가되지 않습니다 : 오류로 "undefined symbol"보다는 "unresolved symbol" 있습니다.

이것은 단지 #include 문제입니다.

  1. 귀하의 script.cpp 파일에 main() 함수를 정의하십시오.

  2. /gwan/include라는 사용자 정의 포함 파일에 전념 한 G-WAN 폴더입니다하지만 당신이 올바른 구문을 사용하는 경우뿐만 아니라 ... /csp/my_include.hpp를 사용할 수 있습니다

을 예를 들어, /csp/hello.cpp에 #include "toto.hpp"있는 것은 나를 정의와 gwan/include/toto.hpp 파일에을 구현 (또는 이의 #pragma와 스크립트에 연결된 미리 컴파일 된 라이브러리에 toto.hpp에 정의 구현 ++ 기능을 C에 도달 할 수 있습니다 링크).

대신 #include <toto.hpp>을 사용하면 SYSTEM INCLUDE PATH가 대신 검색됩니다 (그러면 라이브러리가 올바르게 설치되었다는 가정하에 제공됩니다).

당신이 시스템에 설치되지 않았습니다 사용자 지정 폴더에 대한 #include "toto.hpp"를 사용하려면

, 당신은 그것의 경로를 지정 G-WAN의 #pragma include "../my_folder" 지시어를 사용하거나 각을 포함 당신은 명시 적으로 지정할 수 있습니다 #include "../my_folder/toto.hpp"를.

아무 것도 없기 때문에 C/C++ 종속 규칙 만 적용됩니다. (그리고 G-WAN은 시스템 설정과 관련없는 대체 방법을 제공함으로써 실제로 도움이됩니다).

라이브러리의 경우 (SQLite, Cairo, mySQL, cURL 등의 G-WAN 예제 참조) SYSTEM 변수에서 위치를 내 보낸 미리 설치된 라이브러리를 사용하거나 /gwan/libraries에 라이브러리를 넣을 수 있습니다 폴더 및 포함 파일을 /gwan/include 폴더에 저장하십시오.

자신의 라이브러리를 작성할 때 미리 컴파일해야한다는 점에 유의하십시오. 이것은 컴파일러가 (정의를 포함하기 위해) "gwan.h"를 # 포함 할 수 있지만 링커는 G-WAN 심볼을 찾을 수있는 곳을 알 수 없으므로 분명히 G-WAN 심볼을 사용할 수 없다는 것을 의미합니다. G-WAN 스크립트에서 항상 G-WAN API를 사용하는 방법이 있습니다. 커스텀 라이브러리는 범용이거나 G-WAN이 사용할 페이로드를 버퍼해야합니다. G-WAN은 호출을 사용하여 G-WAN 사용 영구 회신을 G-WAN 서블릿이 제공하는 reply xbuffer없이 구축 할 수 있기 때문에 이중 복사가 필요하지 않습니다.

이제 linking에 대한 마지막 단어 (문제의 원인은 아니지만 혼란에 참여할 수 있음). C와 C++을 혼합하는 경우 extern C {}을 사용하여 C에서 호출 된 C++ 프로토 타입을 래핑합니다 (그렇지 않으면 "unresolved symbols" 임).

이 모든 정보를 통해 모든 가능한 상황에 직면 할 준비가되어 있어야합니다.

+0

안녕 Gil. #include 팁을 주셔서 감사합니다. PATH를 지정하면 때때로 처리하기가 어려울 수 있습니다. –

+0

내 라이브러리에 GWAN의 JSON 및 KV 저장소 호출을 사용합니다. 트릭은 함수 포인터를 사용하고 GWAN C 스크립트 내에서 대응하는 GWAN 호출에 함수 포인터를 초기화하는 것입니다. 이 접근법의 좋은 점은 라이브러리가 GWAN에 의존하지 않을 수 있으며 필요할 경우 다른 JSON 또는 KV 저장소 구현으로 폴백 할 수 있다는 것입니다. –

+0

Ogla, 함수 포인터 초기화 (고급 사용자를위한 정교한 접근법)는 연결 핸들러의 int() 호출에서 구현하는 것이 가장 좋습니다 (이것은 서버 수명 기간 동안 한 번 실행됩니다). – Gil

0

또한 가 .H 또는 .HPP의 우아하지만 수정

여부 그럼에도 불구하고, 헤더 파일에 모든 코드를 이동하여를 해결할 수 사용법 #include 파일 내부에 gwan.h 문자 참조의 문제를 해결합니다. 그리고 내가 원했던 간단한 확장을 위해 충분히 좋다.

/libraries/sqlite3/sqlite.h가 도움이됩니다.

@ gil 감사합니다.