2

나는 저주받은 cl.exe를 실행하는 데 이상한 문제가 있습니다. C/C++ 프로젝트로 구성된 대용량 VS2008 솔루션에서 몇 가지 스크립트를 실행하여 추가 처리를 수행하는 프로젝트가 하나 있습니다. 이 프로젝트는 Perl 스크립트 (ActiveState Perl이 시스템에 있음)를 호출하는 사전 빌드 이벤트로 구성됩니다. 이 Perl 스크립트는 /E으로 cl.exe를 호출하여 전처리 된 출력을 생성하여 파일로 리디렉션합니다. 펄 라인은 다음과 같습니다Perl에서 cl.exe를 호출 할 때 cl.exe가 출력을 생성하지 않는 이유는 무엇입니까?

my $foo = `"\path\to\cl.exe" @args.rsp >out.txt 2>err.txt`; 

args.rsp이 표준 출력에 미리 프로세서 출력을 얻을 수 /E을 포함, CL.EXE에 대한 명령 행 인수의 무리 포함 된 일반 텍스트 파일입니다.

이 정확한 명령 줄은 VS2008 명령 프롬프트에서 실행할 때 예상대로 작동합니다. 내 Windows XP 시스템에서도 프로젝트를 잘 만들 수 있습니다. 그러나, 내 새 Windows 7 상자에서 프로젝트를 빌드 할 때 out.txt 빈 끝납니다. 또한 동료의 Windows 7 상자 중 일부에 추가해야하며 정상적으로 작동하며 다른 일부에서는 작동하지 않습니다.

분명히 구성 차이가 있지만 분명히있을 수 있습니다. VS2008 SP1 및 ActiveState Perl의 일치하는 버전을 확인했습니다. 나는 펄 스크립트 내에서 무수한 해결 방법을 시도했다. 을 사용하여 파일에 출력 한 다음 파일을 옮긴다 (파일이 비어 있음). 아무 것도 동작을 변경하지 않았습니다. 출력은 명령 줄을 수동으로 실행할 때 생성되지만이 프로젝트의 미리 빌드 이벤트 내에서 실행될 때는 생성되지 않습니다.

어떤 종류의 구성 문제가 발생했는지에 대한 아이디어가 있습니까? 나는 추구 할 길에서 거의 벗어났다.

+0

나는이 문제를 해결했다는 것을 알았지 만 경로에서 백 슬래시가 누락 된 것처럼 보이거나 놀라 울 따름이다. –

답변

2

ACL 문제와 같은 소리입니다. 액세스 문제를 기록하기 위해 창을 변경 한 다음 이벤트 로그를 검사하여 액세스 거부 오류가 발생한 사용자를 확인할 수 있습니다.

설정이 로컬 정책 | 감사 정책 | 감사 개체 액세스

+0

흠, 고마워! 나는이 시점에서 UAC를 비활성화하고 devenv.exe, cl.exe 및 perl을 설정했다는 사실을 잊어 버렸습니다.관리자 권한으로 실행하려면 exe all을 사용하십시오 (관리자 권한이있는 계정에서 가져옴). 그러나 나는 ACL을 가지고 주위를 조금만 돌아보고 좀 더 많은 정보를 얻을 수 있는지 알게 될 것이다. –

+0

흠, 나는 내 사용자에게 문제의 출력 파일 (실제로 파일을 삭제 한 후 다시 만들고 감사 설정이 손실되기 때문에 실제로 출력 디렉터리에있는 모든 파일)에 대한 실패와 성공을 감사했습니다. 나는 객체 접근을위한 많은 감사 성공을 보았지만 실패는 없었다. 나는 전에 감사를 해본 적이 없기 때문에 나는 뭔가 잘못하고있는 것이 가능하다. : -/ –

+0

파일이 어디에 만들어지고 있는지 모르기 때문에 항상 모든 파일/디렉토리를 감사하도록 설정했다. 임의의 tmp 위치). – Hogan

0

프로그램의 종료 코드를 확인하십시오. File::Spec과 같은 것을 사용하여 이식 가능한 방식으로 실행 파일 이름을 만들 수 있습니다. 또한 @args가 보간되지 않았는지 확인하십시오. 실행하기 전에 커맨드 라인을 인쇄하여 원하는 것인지 확인할 수 있습니다. 파일 err.txt은 무엇이 남았습니까?

+0

cl.exe의 종료 코드는 perl 스크립트와 마찬가지로 성공합니다. perl println과'echo ... '를 통해 명령 행을 인쇄하고 @args가 올바르게 전달되는지 확인했습니다. err.txt는 항상 비어 있습니다. 제안 해 주셔서 감사합니다. 지금 막 며칠 동안 해킹했습니다. :-) –

1

와우, 이것에 대한 해결책은 내가 예상했던 것보다 훨씬 낯선 것이 었습니다. 내가 작업하고있는 컴퓨터 (그리고이 문제를 겪고있는 다른 동료들)는 Bootcamp 및 Windows 7이 설치된 Mac Pro입니다. 그 때문에 C :는 윈도우 드라이브를, E :는 맥 드라이브를 갖게한다. 사전 빌드 이벤트에는 각 드라이브 문자가있는 지 확인하기 위해 각 드라이브 문자를 테스트하는 몇 줄의 행이 있고 그럴 경우 경로에 X : \ Perl \ bin을 추가하기 때문에 문제가 발생합니다. E : \ Perl \ bin은 존재하지 않지만 경로에 추가됩니다. 나중에 perl 스크립트가 실행 된 다음 cl.exe를 호출하고 어떤 이유로 Mac 드라이브에 디렉토리가 있으면 cl.exe가 실패합니다. 왜? 나는 모른다. 어쨌든 경로에서 Mac 드라이브 디렉토리를 제거하면 문제가 해결됩니다!

모두에게 감사드립니다.

관련 문제