2010-04-10 3 views
0

제 학사 학위 논문의 경우, 큰 정수를 인수 분해 (소수 분해)하는 알고리즘의 분산 버전을 구현하고 있습니다. 이것은 예를 들어. RSA 암호 시스템의 보안.Boost :: Asio for C++의 문제점

내 비전은 클라이언트 (Linux 또는 Windows)가 응용 프로그램을 다운로드하고 일부 숫자를 계산한다는 것입니다 (이들은 독립적이어서 병렬 처리에 적합합니다). 번호 (매우 자주 발견되지 않음)는 마스터 서버로 전송되어 이러한 번호를 수집합니다. 일단 마스터 서버가 충분한 수를 수집하면 나머지 계산을 수행하게되며 쉽게 계산할 수 없습니다.

어쨌든, 기술. Boost :: Asio를 사용하여 소켓 클라이언트/서버 구현을 수행하고 클라이언트와 마스터 서버 간의 통신을 고려했습니다. 이후 나는 리눅스와 윈도우 모두를 위해 컴파일하고 싶었고, 나는 창문이 시작하기에 좋은 장소라고 생각했다.

bootstrap

.\bjam

것은 그것은 모두가 잘 컴파일 : 그것은 Boost Getting Started page 말했다 그래서 나는 그것을 부스트 라이브러리를 다운로드하고 컴파일. 그런 다음 자습서 예제 중 하나 인 asio에서 client.cpp를 컴파일하려고 시도합니다 (여기에 편집 : 제한 때문에 게시 링크가 없습니다).

cl /EHsc /I D:\Downloads\boost_1_42_0 client.cpp

그러나 나는이 오류를 얻을 : :이처럼, 마이크로 소프트 비주얼 스튜디오 2008는 Visual C++ 컴파일러를 사용하고

/out:client.exe

client.obj

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-s-1_42.lib'

사람이 잘못 될 수 있는지 어떤 생각을 가지고, 또는 내가 어떻게 움직일 수를 앞으로? 나는 C++을위한 간단한 클라이언트/서버 소켓 프로그램을 얻기 위해 일주일 내내 노력했지만 행운이 없었다. 심각한 좌절감이 있습니다.

감사합니다.

답변

2

빌드가 실패하는 이유는 부스트 시스템이 포함 된 라이브러리 파일을 찾을 수 없기 때문입니다. Boost에는 "편리한"자동 링크 기능이 포함되어 있으므로 바이너리 libaray (헤더 전용 라이브러리가 아니라)에 헤더 파일을 포함하면 boost가 자동으로 라이브러리에 링크되어야한다는 것을 컴파일러에 알립니다. 단점은 부스트가 컴파일러에게 어디에서 라이브러리를 찾을지를 알려주지 않는다는 것입니다.

짧은 답변은 부스트 ​​시작 가이드에서 조금 더 읽는 것입니다. 이 페이지는 컴파일러 명령 행에 필요한 플래그를 추가하는 방법을 보여줍니다 : Getting started on windows: linking from the command line.

먼저해야 할 일은 .lib 파일을 찾는 것입니다. Boost는 깊은 디렉토리 구조에 숨기므로 bjam을 실행 한 디렉토리에서부터 검색합니다. 파일이있는 디렉토리를 적어 두십시오. bootstrap --prefix=/some/install/locationbjam install을 사용하여 빌드 한 원본 디렉터리 이외의 다른 곳에 추가 기능을 설치할 수도 있습니다.

Visual Studio 솔루션을 사용하거나 명령 줄에서 프로젝트를 빌드하고 있습니까?

솔루션 파일을 사용하는 경우 솔루션 속성에서 링크 페이지를 찾으십시오. 추가 라이브러리 경로를 입력 할 수있는 상자가 있어야합니다. .lib 파일을 향상시키는 디렉터리를이 상자에 추가합니다.

명령 링크에서 cl을 사용하는 경우 cllink의 명령 줄 옵션을 숙지하십시오. cl 옵션 /link을 사용하여 링커에 명령을 전달할 수 있으며 찾고있는 링커 명령은 /libpath입니다.

+0

안녕하세요. mch, 답변 해 주셔서 감사합니다. libboost_system-vc90-mt.lib libboost_system-vc90-MT-1_42.lib libboost_system : 부스트의 새로운 컴파일을 수행 한 후, 나는 내가 필요로하는 일, 예를 들어 매우 유사 이름이 일부 lib 디렉토리 파일을 찾을 수 -vc90-mt-gd.lib libboost_system-vc90-mt-gd-1_42.lib 불만을 제기하는 정확한 이름은 없지만 libboost_system-vc90-mt-s-1_42.lib입니다. 그래서 여기서 어디로 가야할 지 모르겠습니다. -s는 정적 라이브러리라는 것을 의미합니까? 그렇다면 Boost에 내가 그렇게 컴파일하려고한다고 어떻게 말할 수 있습니까? 명령 프롬프트에서 모든 것을 컴파일하고 있습니다. –

+0

-s는 C++ 표준 라이브러리와 런타임에 정적으로 링크 된 라이브러리를 찾고 있음을 의미합니다. 이 라이브러리를 빌드하려면 가능한 모든 조합을 빌드해야하는'bjam link = static link = shared runtime-link = static runtime-link = shared'를 시도하십시오. – mch

+0

고마워 mch, 부스트를 새로 압축 해제하고 부스트 스트랩을 수행하고 bjam link = static runtime-link = static을 수행하여 작동 시켰습니다. 그런 다음 라이브러리 경로 (/ stage/lib /)를 cl에 플래그로 추가했습니다. 감사합니다. –

관련 문제