문제

나는 짜증나는 문제는 할 수 있습니다 어떻게든 피하지만,다른 손에서 오히려 상단에있는 그것의 이해 정확히 무슨 이후,그것은 다음과 같이 물건은 정말 여기에 있습니다.

여기에는 이야기:내가 있는 간단한 OpenGL 는 잘 작동:결코에 있는 중요한 문제를 컴파일하고,연결하고,또 그것을 실행.지금 시도 하기로 이동하는 일부의 집중적인 계산으로 worker 쓰레드는,주문을 가능하게 만들 GUI 훨씬 더 민감하게 반응하는 사용 합니다.실,물론입니다.

즉,를 추가하는 경우 다음과 같은 조각의 시작 부분에 내.cpp file:

#include <boost/thread/thread.hpp>

void dummyThreadFun() { while (1); }    

boost::thread p(dummyThreadFun);

, 다음 시작했을 받고"이 응용 프로그램을 시작하지 못했기 때문에 MSVCP90.dll 발견되지 않았습니다."을 실행하려고 할 때는 디버그 빌드.(릴리스 모드가 작동 확인됩니다.)

지금 보는 실행 파일을 사용하여 종속성 워커 또한되지 않을 찾아 이 DLL(되는 것으로 나),제가 볼 수 있는 우리가 그것을 찾기 위해서 호출 할 수 있도록 다음과 같은 기능:

?max@?$numeric_limits@K@std@@SAKXZ
?max@?$numeric_limits@_J@std@@SA_JXZ
?min@?$numeric_limits@K@std@@SAKXZ
?min@?$numeric_limits@_J@std@@SA_JXZ

다음을 시도 변환 모든 인스턴스 minmax 사용 매크로를 대신하지만,아마도 찾을 수 없 모든 참으로 그들을 이 도움이되지 않았다.(나는 일부를 사용하여 외부 라이브러리는 내가 없 소스 코드를 사용할 수 있다.하지만 경우에도 나는 이렇게 할 수 있다—나는 생각하지 않는 그게 올바른 방법이 정말.)

그래서 제 질문이—나—습니다:

  1. 왜 우리는 비 DLL debug 지만 작업으로 디버그 빌드?
  2. 무엇이 올바른 방법으로 문제를 해결?나라도 빠르고 더러운 하나?

나이에서 처음 꽤 많은 바닐라 설치 Visual Studio2008.다음 설치하는 기능 팩와 SP1,하지만 그들은 돕지 않았다.도 물론을 재건하려고했다.

내가 사용하여 미리 작성된 바이너리에 대한 강화(v1.36.0)입니다.이번이 처음은 아 I 부스트를 사용하는 이 프로젝트에서는,하지만 그것은 첫 번째 시간이 될 수 있는 내가 사용하는 부분에 따라 별도의 소스입니다.

비활성화를 증 연결하는 데 도움이 되지 않습니다.프로그램이라는 사실입니다 OpenGL 될 것 같지 않 관련 하나는 유사한 문제를 추가할 때의 같은 세 라인의 코드를 간단하는 콘솔 프로그램(하지만 그것에 대해 불평 MSVCR90.dll 고 _mkdir, 때 나는 교체 후자 boost::create_directory, 문제 멀리 갔다!!).그리고 그것은 정말 그냥 제거하거나 추가 이 세 가지선하는 프로그램 실행을 확인,또는 실행되지 않는 모두,각각합니다.

내가 말할 수 없을 이해하 Side-by-Side(알지도 못하는 경우 이와 관련이지만 그게 내가 가정을 위해 지금),그리고 솔직히 말해,저는 슈 관심 중 하나로 긴 수를 구축,디버그 및 배포할 수 내 응용 프로그램...


편집 1: 을 구축을 위해 노력하는 동안 옷을 벗었다운 예제는 어쨌든 재현한 문제가 발견되는 문제 할 수 있으로 확산 Toolkit, 사용하는 요인이 모든 일반적인 내 프로그램이 갖는 문제입니다.(그러나 나는 이 시작하기 전에 링크를 강화 물건입니다.)

나는 지금은 최소한의 프로그램할 수 있습을 재현하는 문제입니다.그것은 두 개의 편집 단위 A.cpp 고 B.cpp.

A.cpp:

#include "sp.h"

int main(int argc, char* argv[])
{
    mailbox mbox = -1;
    SP_join(mbox, "foo");

    return 0;
}

B.cpp:

#include <boost/filesystem.hpp>

부:

  1. 면 내가 줄을 주석으로 SP_join 의 A.cpp 문제입니다.
  2. 면 나는 주석으로 단일 라인의 B.cpp 문제입니다.
  3. 이동하는 경우 또는 복사 B.cpp's 싱글 라인의 시작 또는 끝 A.cpp 문제입니다.

(시나리오에서 2,3,프로그램 호출할 때 SP_join, 하지만 그것 때문에는 사서함은 유효하지 않...이것은 할 수 없으로 손을에서 문제를 해결합니다.)

또한,산의 핵심 라이브러리에 연결되어,그리고 확실하게 대답의 일부를 제 질문 1 위,터가 존재하지 않기 때문에 디버그 빌드는 lib 내에서 시스템입니다.

현재,저는 노력을 오는 무언가를 만드는 것이 가능한 문제를 재현에서 또 다른 환경이다.(더라도 나는 매우 놀라게 될 것입하는 경우 실제로 그것을 반복할 수 있 외부 내 건...)


Edit2: 지금 우리가 패키지를 사용하는할 수 있었을 재현에 문제가 거의 바닐라 설치 WinXP32+VS2008+Boost1.36.0(아직도 사전 구축된 바이너리에서 BoostPro 컴퓨팅).

범죄자는 반드시 확산 lib,나를 구축하는 어떻게든 필요한 오히려 오래된 버전의 STLPort 한 MSVC6!그럼에도 불구하고,제가 여전히 찾을 증상이 상대적으로 재미 있습니다.또한,그것은 좋은 것을 들을 수 있는 경우 실제로 재현 문제를 포함하여—시나리오 1-3 니다.패키지가 아주 작은,그리고 포함해야 합니다 모든 필요한 조각합니다.

으로 밝혀 문제가지 않았는 아무 상관이 있습니다.실 특히,이 예제에서 볼 수 있듯이 지금 사용하는 향상 파일시스템 라이브러리입니다.또한,그것은 지금에 대해 불평 MSVCR90.dll 이지,P 으로 이해합니다.

도움이 되었습니까?

해결책

습니다.스레드가 꽤 몇 가능한 빌드를 조합하기 위해 시도하고 수용을 위해 모든 차이에서 연결 가능 시나리오와 MSVC.첫째,당신이 할 수 있거나 정적으로 링크를 강화.스레드,또는 링크를 강화.스레드에서 별도의 DLL.할 수 있습니다 다음에 대한 링크를 DLL 버전의 MSVC runtime,또는 정적 라이브러리 런타임입니다.마지막으로,당신은 링크를 런타임 디버깅 또는 출시합니다.

합니다.스레드 헤더를 시도하고 자동 검출 시나리오를 구축하여 미리 정의된 매크로는 컴파일러에서 생성됩니다.에 연결하기 위해에 대하여 버전을 사용하는 런타임 디버깅야 _DEBUG 정의됩니다.이에 따라 자동으로 결정/MD/MDd 컴파일러 스위치,그래서 그것은 확인해야 하지만,문제에 대한 설명 그렇지 않으면 의미한다.

어떻게 사전 구축된 바이너리에서?당신은 명시적으로 선택하면 도서관에서 귀하의 프로젝트 설정,또는 당신을 시키는 자동 연결 메커니즘을 적절한을 선택합니다.lib 파일입니까?

다른 팁

내가 믿고 있었다는 이와 같은 문제가 높다.에서 나의 이해 그런 일이기 때문에 부 헤더에 사용하는 전처리기 명령어를 링크에 대해 적절한 lib.하는 경우 디버그 및 릴리스 라이브러리에서 동일한 폴더가 다른 이름을"자동 연결"기능이 제대로 작동하지 않습니다.

내가 무엇을 했는가를 정의 BOOST_ALL_NO_LIB 한 프로젝트(방지하는 헤더에서"자동 연결")을 사용하여 VC 프로젝트를 설정하는 링크에 대한 올바른 라이브러리입니다.

처럼 다른 사람들이 대답을 향상 측면의 문제입니다.여기에 약간의 배경 정보에 MSVC 측면의 것들을 저장할 수 있습니다 추가 두통입니다.

가는 4 가지 버전의 C(C++)가능한 런타임:

  • /MT:런타임.lib(C),libcpmt.lib(C++)
  • /MTd:libcmtd.lib,libcpmtd.lib
  • /MD:msvcrt.lib,msvcprt.lib
  • /MDd:msvcrtd.lib,msvcprtd.lib

DLL 버전이 여전히 요구하게 연결하는 정적 lib(는 어떻게든 모든 설정에 대한 링크를 DLL 을 런타임에-난 알아보).지 모든 경우에 디버그 d 접미사입니다.C runtime 사용 c 중위,그리고 C++runtime 사용 cp 중위.패턴을 참조하십시오?모든 응용 프로그램에서,당신은 이제까지의 링크 라이브러리에 한 사람들의 행이 있습니다.

때로는(로에 당신의 경우),당신은 자신을 찾을 연결하는 다른 사람의 정적 라이브러리를 사용하도록 구성된 잘못된 버전의 C 또는 C++런타임(을 통해 지독하게 짜증 #pragma comment(lib)).고 이를 발견할 수 있습의 링커 자세한 정도까지 방법이지만,그것의 실제 피타냥을하기 위해 노력하고 있습니다."죽은 쥐주"솔루션을 사용하는 것입 /nodefaultlib:... 링커를 설정하는 규칙 6C 및 C++라이브러리는 당신이 알고 있을 필요가 없습니다.내가 사용했던 과거에 이런 문제없이,하지만 난 그것은 긍정적인을 작동...아마 누군가가 나올 것입니다 목공예품을 말하는 나에게 어떻게이션을 일으킬 수 있는 프로그램을 먹고 아기에서 금요일 오후.

이 링크가 오류가 있습니다.그것처럼 보이는 당신 연결을 향상 DLL 는 자체 연결하여 잘못된 C++runtime(도 이 페이지, 은,텍스트 검색에 대한"실").도 boost::posix::time 라이브러리에 링크를 올바른 DLL.

불행하게도,내가 찾는 페이지를 설명하는 방법을 선택하는 올바르게 내장 부 DLL(지만 내가 찾았어요 three-year-old 이메일 그것을 보인 BOOST_THREAD_USE_DLLBOOST_THREAD_USE_LIB).


보고에서 응답을 다시 나타납니다,당신이 사용하는 사전 구축된 이 게임의 목표입니다.DLL 할 수 없 링크 의 일부 기능 팩 TR1 (두 번째 질문에서는 페이지). 는 기능이 마이크로소프트 웹사이트.또는 당신을 필요로 할 것 다른 바이너리를 연결합니다.명 boost::posix::time 라이브러리 링크에 대한 패치가 적용되지 않은 C++runtime.

부터 이미 적용되는 기능 팩,나는 생각한 다음 단계는 것을 것을 구축을 높입니다.는 경로 나는 항상,그리고 그것은 매우 간단하다: 다운로드 BJam 바이너리, 고 실행하는 부스트에서 스크립트를 구축 라이브러리 소스입니다.그것입니다.

지금 이 있어도 조금 더 재미있는...면 추가이 어딘가에서 원본:

boost::posix_time::ptime pt = boost::posix_time::microsec_clock::universal_time();

(과 함께 해당하는 #include 물건),그 다음 그것을 다시 확인을 작동합니다.그래서 이것이 하나 빠르고지도 너무 더러운 솔루션이지만,hey—what's going on here,정말입니까?

메모리에서 다양한 부분을 향상 라이브러리를 필요 정부는 전처리기에서 플래그하기 위해 컴파일할 수 있습니다.재료 BOOST_THREAD_USE_DLL 그래서.

BOOST_THREAD_USE_DLL 되지 않을 일으키는 것이 특정 오류가 있지만,그것을 기다리고 있을 수 있습니다 당신은 정의 _DEBUG 입니다.내가 기억하는 몇 년 전에 우리의 부 C++프로젝트에 우리는 꽤 몇 가지 추가 BOOST_XYZ 전처리기는 정의를 선언 visual studio 컴파일러 옵션(또는 makefile)

확인 config.hpp 에서 파일을 향상 실 디렉토리에 있습니다.할 때에 끌어 ptime 물건의 가능성을 포함한 다른 config.hpp 파일을 수있는,다음 그 정의하는 전처리기 차별화된 방식으로 행동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top